基于角色的模型列表授权

时间:2012-09-04 10:25:06

标签: asp.net-mvc-3 authorization authorize-attribute role-based

我有3个型号[User,Role和UserRole]

Use {ID [PK], Name, Email, Password, .....}
Role {ID [PK], Name, Description, .......}
UserRole {UserID [FK], RoleID [FK]}

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

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

这很好,我需要的是,

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

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

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

2 个答案:

答案 0 :(得分:1)

嗯,有两个问题。

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

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

您会收到如下消息:

  

属性参数必须是常量表达式,typeof表达式   或属性参数类型

的数组创建表达式

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

可以找到一个示例(您可以适应您的问题)here

答案 1 :(得分:1)

是。

  1. 覆盖global.asax
  2. 中的PostAuthenticateRequest
  3. 从db
  4. 加载角色
  5. 制作新的GenericPrincipal
  6. 将主体分配给Thread.CurrentPrincipalHttpContext.Current.User
  7. 示例:

    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;
        }
    }