关于 c#:MVC5 ASP Identity 动态 Authorize 属性

MVC5 ASP Identity dynamic Authorize attribute

我有一个带有后端的 MVC5 项目来配置哪个角色可以访问哪个菜单。实现基于角色的授权的正常方式是这样的。

1
2
3
4
5
6
[Authorize(Roles="Admin")]
public ActionResult UpdateProduct(ProductModel model)
{
     //do something
     return View(model);
}

因为我需要角色是动态的,所以我正在考虑这样的事情。

1
2
3
4
5
6
[Authorize(Roles=GetRoles("UpdateProduct"))]
public ActionResult UpdateProduct(ProductModel model)
{
     //do something
     return View(model);
}

显然它不起作用,因为属性是静态元数据。

我环顾四周,发现了这个 MVC 3 多角色和用户的动态授权,但是有没有更简洁的方法来实现这一点?

注意:我试图避免在每个方法中调用 User.IsInRole


C# 中代码属性的定义是它是静态的——因此你不能有一个方法,GetRoles().

您建议需要一个属性,例如:

[Authorize(Roles=GetRoles("UpdateProduct"))]

这意味着您必须在代码中实现 GetRoles(),因此请使用从 Authorize.

派生的自定义属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {

        public CustomAuthorizeAttribute(string roleSelector)
        {

            Roles = GetRoles(roleSelector);
        }

        private string GetRoles(string roleSelector)
        {
            // Do something to get the dynamic list of roles instead of returning a hardcoded string
            return"Somerole";
        }
}

所以现在你可以这样做了:

[CustomAuthorize("updateProduct")]