如何处理ASP.NET MVC中具有多个角色的用户的角色授权?

时间:2013-08-05 12:00:40

标签: asp.net-mvc security roles

我正在尝试找到在ASP.NET MVC中构建安全角色的最佳方法。

基本上角色是静态的(管理员,客户端,技术人员),但他们在每个部分可以做的是可配置的,添加/编辑/删除/查看。

例如,您可以将客户端的安全性配置为特定区域,例如用户帐户。

用户可以是任何角色的组合,因此可以成为客户和技术人员,并拥有两个用户的组合权限。

在ASP.NET MVC中执行此操作的合适方法是什么?

3 个答案:

答案 0 :(得分:1)

我会告诉你这个决议:

  • 数据库

    1. 用户([PK] ID,姓名等)
    2. 角色([PK] Id,姓名,描述等)
    3. UserRoles([PK] UserId,[PK] RoleId)

用户表存储有关用户的信息,例如他们的姓名,电子邮件等。角色存储有关角色的信息,如名称,描述等.UserRoles只是一个查找表,可用于将特定用户与特定角色联系起来。

  • 代码

为了让您的代码能够使用这些表,您可以添加自定义角色提供程序,您将拥有2个方法的足够设施:public override string[] GetRolesForUser(string username)public override bool IsUserInRole(string username, string roleName)

  • 用法

当您完成后,您只需使用授权属性[Authorize(Roles = "Administrators")]来检查用户是否有权访问特定操作或控制器,或者您可以使用Razor验证来显示/隐藏基于用户角色的某些HTML { {1}}


请查看以下链接以获取更多信息

答案 1 :(得分:1)

这就是我们这样做的方式

public enum YourUserRoles
{
    None = 0,
    Admin = 1,
    Consumer = 2
}

public class YourAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
    private readonly YourUserRoles[] _acceptedRoles;

    public YourAuthorizeAttribute(params VoicelrUserRoles[] acceptedroles)
    {
        _acceptedRoles = acceptedroles;
    }

    public YourAuthorizeAttribute(params bool[] allowAll)
    {
        if (allowAll[0])
            _acceptedRoles = new[] { VoicelrUserRoles.Admin, VoicelrUserRoles.Consumer };
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (SessionHelper.UserInSession == null)//user not logged in
        {
            string retUrl = filterContext.HttpContext.Request.RawUrl;
            FormsAuthentication.SignOut();
            filterContext.Result =
                 new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary {{ "controller", "home" },
                                             { "action", "index" },
                                             { "returnUrl",    retUrl } });//send the user to login page with return url
            return;
        }
        if (!_acceptedRoles.Any(acceptedRole => SessionHelper.UserInSession.Roles.Any(currentRole => acceptedRole == currentRole)))
        {
            filterContext.Result = new ViewResult
            {
                ViewName = "~/Views/Shared/Error.cshtml"
            };
        }
    }
}

[YourAuthorize(YourUserRoles.Client )]
public ActionResult Whatever()
{
  ....
}

答案 2 :(得分:0)

  1. 最初你可以查看用户存在多少个角色?
  2. 创建一个视图以显示角色并撰写消息"请选择要继续的角色"
  3. 选择用户类型后,将用户作为选择。