Csharp/C#教程:基于声明的表单身份validation角色分享


基于声明的表单身份validation角色

我正在尝试使用MVC 4中的表单身份validation对用户进行身份validation(我使用的是RavenDB,因此我无法使用标准成员资格提供程序)。 然后,我使用User.IsInRole()方法或AuthorizeAttribute来validation用户是否处于职员角色。

这是我在成功validation时设置票证的位置(目前在UserController.cs ):

 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, model.Email, DateTime.Now, DateTime.Now.AddDays(1), false, model.Email); string hashedTicket = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie( FormsAuthentication.FormsCookieName, hashedTicket); HttpContext.Response.Cookies.Add(cookie); 

这是我检查每个请求的票证( Global.asax ):

 protected void Application_AuthenticateRequest(object sender, EventArgs e) { var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { var authTicket = FormsAuthentication.Decrypt(authCookie.Value); var user = this.UserService.GetUserByEmail(authTicket.Name); var identity = new GenericIdentity(authTicket.Name, "Forms"); var principal = new GenericPrincipal(identity, user.Roles); HttpContext.Current.User = principal; } } 

如果我然后在我的一个动作方法(CalendarController.cs)上放置一个调试点,我得到isStaff等于false

 public ActionResult Index() { var user = HttpContext.User; bool isStaff = user.IsInRole(Role.Staff); return View(); } 

只是为了完成(Roles.cs,只是一个测试事物的临时类):

 public static class Role { public static string Staff { get { return "Staff"; } } public static string Manager { get { return "Manager"; } } } 

任何人都可以帮我解释一下我可能会缺少什么吗? 看起来我设置的角色在我进入动作方法时就消失了。

谢谢大家帮我解决这个问题,我提出的建议(包含在下面)效果很好! 如果用户拥有有效的票证(cookie)并且还使用ClaimsIdentityClaimsPrincipal对象处理基于声明的角色,则可以直接通过登录屏幕自动记录用户,而无需将角色放在用户的cookie中。 它还处理Global.asax.cs文件中的身份validation,而无需使用自定义授权属性。

UserController.cs

 public ActionResult Login() { LoginViewModel model = new LoginViewModel(); if ((HttpContext.User != null) && (HttpContext.User.Identity.IsAuthenticated)) { return RedirectToAction("Index", "Home"); } return View(model); } [HttpPost] public ActionResult Login(LoginViewModel model) { if (!ModelState.IsValid) { return View(model); } bool isAuthenticated = this.userService.IsPasswordValid(model.Email, model.Password); if (!isAuthenticated) { ModelState.AddModelError("AuthError", Resources.User.Login.AuthError); return View(model); } FormsAuthentication.SetAuthCookie(model.Email, model.RememberUser); return RedirectToAction("Index", "Home"); } 

的Global.asax.cs

 protected void Application_AuthenticateRequest(object sender, EventArgs e) { var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { var ticket = FormsAuthentication.Decrypt(authCookie.Value); FormsIdentity formsIdentity = new FormsIdentity(ticket); ClaimsIdentity claimsIdentity = new ClaimsIdentity(formsIdentity); var user = this.UserService.GetUserByEmail(ticket.Name); foreach (var role in user.Roles) { claimsIdentity.AddClaim( new Claim(ClaimTypes.Role, role)); } ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentity); HttpContext.Current.User = claimsPrincipal; } } 

由于您使用的是Raven,我假设您已经创建了自己的自定义MembershipProvider和RoleProvider; 并修改了web.config以使用它们。 你应该有一个类似于这样的条目:

           

如果您使用的是.NET Framework 4.5版,则它使用基于声明的安全性,您无需将角色存储在cookie中。 相反,角色只是存储在ClaimsPrincipal中的另一个声明。 所有主体现在都inheritance自ClaimsPrincipal,并且存储为用户会话

 System.Web.HttpContext.Current.User as ClaimsPrincipal 

如果您的成员资格和角色提供程序设置正确,ASP.NET应使用它们填充ClaimsPrincipal中的角色,然后在检查IsInRole时检查声明。

您还可以从ClaimsPrincipal中检索角色,如下所示。

 principal.FindAll(ClaimTypes.Role).Select(p => p.Value); 

您可以像这样向ClaimsPrincipal添加角色。

 List claims = new List(); foreach (string role in roles) claims.Add(new Claim(ClaimTypes.Role, role)); ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Forms")); 

现在你可以像这样在身份validation后设置你的cookie。

 FormsAuthentication.SetAuthCookie(username, false); 

您没有创建FormsAuthenticationTicket插入角色信息:

  var ticket = new FormsAuthenticationTicket( 1, //ticket version userName, DateTime.Now, DateTime.Now.Add(timeout), //timeout true, //persistent cookies roles,// <---ROLES not model.Email FormsAuthentication.FormsCookiePath); 

- - - 编辑 - - -

忘掉我说的话:我认为你过早地调用IsInRole()或者用户.Roles有错误的值(可能是字符串中的空格:isinrole使用StringComparison.OrdinalIgnoreCase)或者你应该使用FormsIdentity而不是GenericIdentity。

调试器说的是什么?

供参考: http : //pastebin.com/jkqqcg28 (这是我用于处理身份validation的起始模型)

上述就是C#学习教程:基于声明的表单身份validation角色分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1004967.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐