存储/分配已authentication用户的angular色

我正在升级站点使用MVC,我正在寻找设置身份validation的最佳方式。

此时,我已经login到Active Directory:validation用户名和密码,然后设置Auth cookie。

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

[Authorize(Roles = "admin")] 

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

在对用户进行身份validation时,您将生成一个新的GenericPrincipal实例。 构造函数接受一组string,这些string是用户的angular色。 现在设置HttpContext.Current.User等于通用主体,并写入身份validationcookie,这应该做到这一点。

angular色被添加到HttpContext的IPrincipal 。 您可以创build一个GenericPrincipal ,parsing构造函数中的angular色列表,并将其设置为HttpContext.User。 GenericPrincipal将通过User.IsInRole("role")[Authorize(Roles="role")]属性

一种这样做的方法(在C#中)是在创build身份validation票据时将用户数据参数中的angular色添加为逗号分隔的string

 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); 

然后访问身份validation票证中的angular色列表,并从您的Global.asax.cs中创build一个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; } } 

对于那些使用MVC 4或更高版本的人,在使用David Glenn的回答时,你需要采纳Jaroslaw Waliszko的build议:

“我已经在ASP.NET MVC 4中testing了它,我build议使用Application_PostAuthenticateRequest,否则通用主体将被覆盖。 – Jaroslaw Waliszko 9月7日16:18

因此,如上所述,您所需要做的就是将Application_AuthenticateRequest方法名称replace为Application_PostAuthenticateRequest以使其工作。 为我工作就像一个魅力! 如果我被允许高举Jaroslaw和David,我会的。

我会倾向于创build一个自定义的angular色提供者。 示例:

http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-with-repository-injection/

您是否可以不join授权存储angular色pipe理器或查找(例如,在Codeplex上)或编写另一个与Active Directory一起使用的angular色提供者来获取组信息?

这将为您节省authentication用户的麻烦,获得他们的angular色,然后将这些信息重新传递给构造函数,这些都将自动作为框架的一部分发生。