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)
对用户进行身份验证时,将生成新的GenericPrincipal实例.构造函数接受一个字符串数组,这些字符串是用户的角色.现在将HttpContext.Current.User设置为等于通用主体并编写auth cookie,这应该这样做.
对于使用MVC 4或更高版本的用户,在使用David Glenn的答案时,您需要听Jaroslaw Waliszko的建议:
“我已经在ASP.NET MVC 4中对其进行了测试,建议改用Application_PostAuthenticateRequest。否则,通用主体将被覆盖。” – 9月7日Jaroslaw Waliszko在16:18
因此,如上所述,您要做的就是用Application_PostAuthenticateRequest替换Application_AuthenticateRequest方法名称,以使其正常工作。对我来说就像一个魅力!如果允许我投票赞成Jaroslaw和David,我会的。
归档时间: |
|
查看次数: |
37161 次 |
最近记录: |