2009-11-30 134 views
53

我正在升级站点以使用MVC,并且正在寻找设置身份验证的最佳方式。存储/分配经过身份验证的用户的角色

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

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

[Authorize(Roles = "admin")] 

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

回答

6

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

1

您是否可以不在authorization store role managerfind (e.g. on Codeplex)writewrite中放置另一个与Active Directory一起使用以获取组信息的角色提供程序?

这将为您节省认证用户,获取角色,然后将该信息重新传递给构造函数的麻烦,并且将作为框架的一部分自动发布给您。

121

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

这样做(在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); 

然后从身份验证票证从你的Global.asax.cs

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

如果克劳斯在你之前没有回答,我会给你正确的答案。这是我做事情的确切方式。感谢您的详细解答。对不起,这有点晚了。 – 2009-12-01 15:04:53

+0

我想这不适用于禁用Cookie的用户? – Omu 2010-02-17 20:16:56

+1

@Omu您可以通过简单地修改Application_AuthenticationRequest()方法来在Cookie中查找身份验证票证(如果该Cookie不存在),以支持无Cookie身份验证。重要的部分是角色存储在加密的身份验证票证中。 – 2010-02-17 22:27:45

4

对于那些使用MVC 4或更高版本,你需要利用戴维·格伦的回答时采取雅罗斯瓦夫Waliszko的建议是:

“我在ASP中进行了测试。 NET MVC 4,我建议使用Application_PostAuthenticateRequest,否则通用主体将被覆盖。“ - Jaroslaw Waliszko 9月7日16:18

因此,如上所述,您只需将Application_AuthenticateRequest方法名替换为Application_PAuthenticateRequest即可使其工作。像我的魅力一样工作!如果我被允许对Jaroslaw和David进行升级,我会的。

+3

我试过了,但由于我是新注册的成员,所以我无法发表评论,因此我的堆栈溢出声誉不存在。如果这经过它会震惊和惊喜我:) *队列休克和惊喜* – Gareth 2014-01-06 05:52:11

相关问题