如何在asp.net mvc 5身份中的授权属性中使用动态角色

Posted

技术标签:

【中文标题】如何在asp.net mvc 5身份中的授权属性中使用动态角色【英文标题】:how to use dynamic role in authorize attribute in asp.net mvc 5 identity 【发布时间】:2018-02-15 07:45:31 【问题描述】:

我是 asp.net 身份的新手。我正在努力学习它。我想了解如何在 asp.net MVC 5 身份中的授权属性中使用动态角色。因为如果我们在应用程序中有很多角色,那么我们就不能通过硬编码来装饰它。请详细提供一个很好的例子来帮助我。

提前谢谢你:-)

【问题讨论】:

“动态角色”是什么意思? 尝试做一个约定,在 Authorize 属性中使用正则表达式。我以前做过,不知道现在是否支持。 【参考方案1】:

扩展 AuthorizeAttribute 以支持像这样的正则表达式:

class RegexAuthorizeAttribute : AuthorizeAttribute

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    
        if (httpContext == null)
        
           return base.AuthorizeCore(httpContext);
        

        IPrincipal user = httpContext.User;
        if (user == null || user.Identity == null || !user.Identity.IsAuthenticated)
        
            return base.AuthorizeCore(httpContext);
        

        if (!string.IsNullOrEmpty(Users) && Regex.IsMatch(user.Identity.Name, Users))
        
            return true;
        

        if (!string.IsNullOrEmpty(Roles))
        
            var rolesManager = new RoleStore<IdentityRole>(httpContext.GetOwinContext().Get<ApplicationDbContext>());
            var matchedRoles = rolesManager.Roles.Select(t => t.Name).AsEnumerable().Where(t => Regex.IsMatch(t, Roles));

            if (matchedRoles.Any(user.IsInRole))
            
                return true;
            
        

        return base.AuthorizeCore(httpContext);
    

稍后你可以将你的角色组织成组,以便能够使用如下正则表达式匹配一堆角色:

    [RegexAuthorize(Roles = @"Role #\d")]
    public ActionResult About()
    
        ViewBag.Message = "Your application description page.";

        return View();
    

这将匹配以下所有角色:角色 #0、角色 #1、...、角色 #9

希望对您有所帮助!

【讨论】:

【参考方案2】:

您可以在此链接中找到 microsoft 支持的完整解释和演示项目,其中包含有关使用 mvc 身份和角色、声明 ....的多个示例。

MVC_Identity

【讨论】:

以上是关于如何在asp.net mvc 5身份中的授权属性中使用动态角色的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 表单身份验证 + 授权属性 + 简单角色

ASP.NET MVC 中的授权属性

ASP.NET MVC 5 - 身份。如何获取当前的ApplicationUser

ASP.NET MVC 5 中的基本身份验证

当我在 asp.net mvc 5 中达到类用户身份时,如何获得新属性?

如何在 ASP.NET MVC 5 中实现自定义身份验证