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

时间:2017-09-06 18:00:53

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-5 asp.net-identity asp.net-identity-2

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

提前谢谢:-)

2 个答案:

答案 0 :(得分: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

希望这有帮助!

答案 1 :(得分:0)

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

MVC_Identity