6

我有 3 个模型 [用户、角色和用户角色]

使用 {ID [PK]、姓名、电子邮件、密码、.....}
角色{ID [PK],名称,描述,.......}
用户角色 {用户 ID [FK],角色 ID [FK]}

考虑一下,控制器上的基于角色的授权使用 [Authorize] 属性指定用户必须具有管理员角色才能访问类中的任何控制器操作

[Authorize(Roles = "Administrator")]
public class PageController : Controller
{
    // Controller code here
}

这很好,我需要的是,

有没有办法将我的角色集合分配给 [Authorize] 属性?例如

我将从登录用户中获取分配的角色并将其存储在列表中。是否可以将此列表分配给 [Authorize] 属性?如下所示:

[Authorize(Roles = MyDynamicallyLoadedList)]
public class PageController : Controller
{
    // Controller code here
}
4

2 回答 2

1

嗯,有两个问题。

首先,您不能将列表用作属性的参数。您可以改用数组。 http://msdn.microsoft.com/fr-fr/library/ms177221%28v=vs.100%29.aspx

其次,attributes 参数的值必须在编译时知道:您的列表的内容只会在运行时知道。

您会收到如下消息:

属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

解决方案是创建一个新的 Authorization 属性(继承自AuthorizeAttribute),并覆盖AuthorizedCore

一个例子(你可以适应你的问题)可以在这里找到

于 2012-09-04T12:04:23.900 回答
1

是的。

  1. 覆盖 global.asax 中的 PostAuthenticateRequest
  2. 从数据库加载角色
  3. 创建一个新的GenericPrincipal
  4. 将委托人分配给Thread.CurrentPrincipalHttpContext.Current.User

例子:

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name);
        HttpContext.Current.User = new GenericPrincipal(User.Identity, rolelist);
        Thread.CurrentPrincipal = HttpContext.Current.User;
    }
}
于 2012-09-04T12:07:32.337 回答