存储/分配经过身份验证的用户的角色

Bil*_*gan 54 asp.net authentication asp.net-mvc forms-authentication

我正在升级网站以使用MVC,我正在寻找设置身份验证的最佳方法.

此时,我已登录Active Directory:验证用户名和密码,然后设置Auth cookie.

如何在登录时存储用户的角色信息,以便我的控制器在用户浏览网站时查看这些角色?

[Authorize(Roles = "admin")]
Run Code Online (Sandbox Code Playgroud)

从Active Directory获取角色列表没有问题.我只是不知道把它们放在哪里,以便控制器能够看到它们.

Dav*_*enn 126

角色被添加到HttpContext 的IPrincipal中.您可以创建GenericPrincipal,解析构造函数中的角色列表并将其设置为HttpContext.User.然后可以通过User.IsInRole("role")[Authorize(Roles="role")]属性访问GenericPrincipal

执行此操作的一种方法(在C#中)是在创建身份验证票证时将您的角色添加为用户数据参数中的逗号分隔字符串

string roles = "Admin,Member";
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
  1,
  userId,  //user id
  DateTime.Now,
  DateTime.Now.AddMinutes(20),  // expiry
  false,  //do not remember
  roles, 
  "/");
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
                                   FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);
Run Code Online (Sandbox Code Playgroud)

然后从身份验证票证访问角色列表,并从Global.asax.cs创建GenericPrincipal

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
  HttpCookie authCookie = 
                Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null) {
      FormsAuthenticationTicket authTicket = 
                                  FormsAuthentication.Decrypt(authCookie.Value);
      string[] roles = authTicket.UserData.Split(new Char[] { ',' });
      GenericPrincipal userPrincipal =
                       new GenericPrincipal(new GenericIdentity(authTicket.Name),roles);
      Context.User = userPrincipal;
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 我在ASP.NET MVC 4中测试了它,我建议使用`Application_PostAuthenticateRequest`代替.否则,将覆盖通用主体. (7认同)
  • 如果您将角色存储在这样的cookie中,如果管理员或其他人删除了用户的角​​色会发生什么?在cookie过期或您清除cookie缓存之前,您不会看到此更新? (4认同)
  • 为每个请求(包括图像,css等)调用此事件.你想要一个只添加一次角色的条件吗? (2认同)

Kla*_*sen 6

对用户进行身份验证时,将生成新的GenericPrincipal实例.构造函数接受一个字符串数组,这些字符串是用户的角色.现在将HttpContext.Current.User设置为等于通用主体并编写auth cookie,这应该这样做.


Gar*_*eth 5

对于使用MVC 4或更高版本的用户,在使用David Glenn的答案时,您需要听Jaroslaw Waliszko的建议:

“我已经在ASP.NET MVC 4中对其进行了测试,建议改用Application_PostAuthenticateRequest。否则,通用主体将被覆盖。” – 9月7日Jaroslaw Waliszko在16:18

因此,如上所述,您要做的就是用Application_PostAuthenticateRequest替换Application_AuthenticateRequest方法名称,以使其正常工作。对我来说就像一个魅力!如果允许我投票赞成Jaroslaw和David,我会的。

  • 我尝试过,但是由于我是新注册会员,所以我的堆栈溢出信誉不存在,所以我无法发表评论。如果这样的话,会让我感到震惊和惊奇:) *排队感到震惊和惊奇* (3认同)