我有三个模型[用户、角色和用户角色]
使用{ID[PK]、姓名、电子邮件、密码……}角色{ID[PK],名称,描述,…………}用户角色{UserID[FK],RoleID[FK]}
考虑控制器上基于角色的授权,使用[授权]属性指定用户必须处于管理员角色才能访问类中的任何控制器操作
[Authorize(Roles = "Administrator")]
public class PageController : Controller
{
// Controller code here
}
这很好,我需要的是
有什么方法可以将我的角色集合分配给[授权]属性吗?例如
我将从已登录的用户中获取已分配的角色,并将其存储在列表中。是否可以将此列表分配给[授权]属性?如下所示:
[Authorize(Roles = MyDynamicallyLoadedList)]
public class PageController : Controller
{
// Controller code here
}
好吧,有两个问题。
首先,不能将"列表"用作"属性"的参数。您可以改用数组。http://msdn.microsoft.com/fr-fr/library/ms177221%28v=vs.100%29.aspx
其次,attributes参数的值必须在编译时已知:您的列表的内容只有在运行时才知道。
你会收到这样的消息:
属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式
解决方案是创建一个新的Authorization属性(继承自AuthorizeAttribute
),并覆盖AuthorizedCore
一个例子(你可以适应你的问题)可以在这里找到
是。
- 覆盖global.asax中的PostAuthenticateRequest
- 从数据库加载角色
- 新建
GenericPrincipal
- 将主体分配给
Thread.CurrentPrincipal
和HttpContext.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;
}
}