我正在尝试在ASP.NET Core1.0(MVC6) web应用程序中设置授权。
更严格的方法-默认情况下,我希望将所有控制器和操作方法限制为具有Admin
角色的用户。因此,我添加了一个全局授权属性,如下所示:
AuthorizationPolicy requireAdminRole = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireRole("Admin")
.Build();
services.AddMvc(options => { options.Filters.Add(new AuthorizeFilter(requireAdminRole));});
然后,我希望允许具有特定角色的用户访问具体的控制器。例如:
[Authorize(Roles="Admin,UserManager")]
public class UserControler : Controller{}
这当然不会起作用,因为“全局过滤器”将不允许UserManager
访问控制器,因为他们不是“管理员”。
在MVC5中,我可以通过创建一个自定义的authorize属性并将我的逻辑放在那里来实现这一点。然后使用此自定义属性作为全局。例如:
public class IsAdminOrAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
ActionDescriptor action = filterContext.ActionDescriptor;
if (action.IsDefined(typeof(AuthorizeAttribute), true) ||
action.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true))
{
return;
}
base.OnAuthorization(filterContext);
}
}
我试图创建一个自定义的AuthorizeFilter
,但是没有成功。API似乎有所不同。
所以我的问题是:是否可以设置默认策略,然后为特定的控制器和操作覆盖它。或者类似的东西。我不想跟这个走
[Authorize(Roles="Admin,[OtherRoles]")]
在每个控制器/动作上,因为这是一个潜在的安全问题。如果我不小心忘记放置Admin
角色,会发生什么?
发布于 2016-12-02 04:13:30
使用@Daniel的解决方案,我遇到了@TarkaDaal在评论中提到的相同问题(每个call...not的上下文中都有两个AuthorizeFilter
,非常确定它们来自哪里)。
因此,我的解决方法如下:
public class IsAdminOrAuthorizeFilter : AuthorizeFilter
{
public IsAdminOrAuthorizeFilter(AuthorizationPolicy policy): base(policy)
{
}
public override Task OnAuthorizationAsync(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
{
if (context.Filters.Any(f =>
{
var filter = f as AuthorizeFilter;
//There's 2 default Authorize filter in the context for some reason...so we need to filter out the empty ones
return filter?.AuthorizeData != null && filter.AuthorizeData.Any() && f != this;
}))
{
return Task.FromResult(0);
}
//Otherwise apply this policy
return base.OnAuthorizationAsync(context);
}
}
services.AddMvc(opts =>
{
opts.Filters.Add(new IsAdminOrAuthorizeFilter(new AuthorizationPolicyBuilder().RequireRole("admin").Build()));
});
这看起来很丑陋,但它在这种情况下是有效的,因为如果您只使用不带参数的Authorize属性,那么无论如何都会被new AuthorizationPolicyBuilder().RequireRole("admin").Build()
过滤器处理。
https://stackoverflow.com/questions/35825021
复制相似问题