我有一个ASP.NET MVC4 Web应用程序,其中包含表users,roles和rolePrivileges
userid用户名密码roleid]值: 1位用户1 12345 3, 2 user2 12345 1, 3 user3 12345 2
[roleid,rolename]值: 1个管理员, 2个客户, 3位客人, 4 ...
[Roleid,Action,GrantAccess]值: 1 /主页/索引Y. 1 /主页/设置Y. 1 / Home / Dashboard Y. 2 /主页/索引Y. 2 /主页/设置N. 2 /主页/仪表板Y. 3 /主页/索引Y. 3 /主页/设置N. 3 / Home / Dashboard N
我想在ASP.NET MVC表单身份验证中实现以下功能:
应动态授予控制器操作拒绝访问角色的权限,如果用户尝试访问未授予用户访问权限的控制器操作,则应注销该应用程序。
1)我想知道实现这一目标的最佳方法,因为对像Authorize(Roles =“admin”)这样的角色名称进行硬编码将无法正常工作
2)我还有用户特定的设置需要在用户登录时初始化,在asp.net表单中存储在会话变量中可以使用asp.net中的TempData完成相同的MVC这是最佳实践?
答案 0 :(得分:2)
您可以根据角色组而不是角色创建操作过滤器。角色组可以以1对多的关系存储在数据库中。 (即1组有很多角色)。然后将组名称提供给操作过滤器。
public class RoleGroupFilterAttribute : ActionFilterAttribute
{
public string GroupName { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string [] users = new string[] {};
string [] roles = new string[] {};
// get the roles / users for the group from your db or storage
// below is an example only
roles = mydb.RoleGroups.Where(r=>r.Name == GroupName).Select(r=>r.Roles).ToArray();
var user = filterContext.HttpContext.User;
var userRoles = Roles.GetRolesForUser();
if (!roles.Any(r => userRoles.Contains(r)) && !users.Contains(user.Identity.Name))
{
// return a not found result or redirect to an action
filterContext.Result = new HttpNotFoundResult();
}
}
}
要使用您,您只需创建管理页面即可管理您的角色组。将过滤器添加到控制器或操作非常简单。
[RoleGroupFilter(GroupName="MyGroup")]
public ActionResult Index()
{
return View();
}
在上面的示例中,我还允许将用户添加到角色组,但这将是您的选择。