首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >覆盖ASP.NET核心1.0MVC中的全局授权筛选器

覆盖ASP.NET核心1.0MVC中的全局授权筛选器
EN

Stack Overflow用户
提问于 2016-03-06 17:05:45
回答 1查看 25.1K关注 0票数 27

我正在尝试在ASP.NET Core1.0(MVC6) web应用程序中设置授权。

更严格的方法-默认情况下,我希望将所有控制器和操作方法限制为具有Admin角色的用户。因此,我添加了一个全局授权属性,如下所示:

代码语言:javascript
复制
AuthorizationPolicy requireAdminRole = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .RequireRole("Admin")
    .Build();
services.AddMvc(options => { options.Filters.Add(new AuthorizeFilter(requireAdminRole));});

然后,我希望允许具有特定角色的用户访问具体的控制器。例如:

代码语言:javascript
复制
[Authorize(Roles="Admin,UserManager")]
public class UserControler : Controller{}

这当然不会起作用,因为“全局过滤器”将不允许UserManager访问控制器,因为他们不是“管理员”。

在MVC5中,我可以通过创建一个自定义的authorize属性并将我的逻辑放在那里来实现这一点。然后使用此自定义属性作为全局。例如:

代码语言:javascript
复制
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似乎有所不同。

所以我的问题是:是否可以设置默认策略,然后为特定的控制器和操作覆盖它。或者类似的东西。我不想跟这个走

代码语言:javascript
复制
[Authorize(Roles="Admin,[OtherRoles]")]

在每个控制器/动作上,因为这是一个潜在的安全问题。如果我不小心忘记放置Admin角色,会发生什么?

EN

回答 1

Stack Overflow用户

发布于 2016-12-02 04:13:30

使用@Daniel的解决方案,我遇到了@TarkaDaal在评论中提到的相同问题(每个call...not的上下文中都有两个AuthorizeFilter,非常确定它们来自哪里)。

因此,我的解决方法如下:

代码语言:javascript
复制
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()过滤器处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35825021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档