我正在开发一个具有简单身份验证过程的asp.net mvc 3.0应用程序。用户填写一个通过ajax调用发送到服务器并获得响应的表单,但是这里的问题是使用以下方法:
FormsAuthentication.SetAuthCookie(person.LoginName,false);
不足以填充“ HttpContext.Current.User”,并且需要运行以下方法:
FormsAuthentication.RedirectFromLoginPage("...");
这里的问题是,正如我提到的,loggin表单使用ajax表单,并使用json获取响应,因此无法进行重定向。
我如何填写’HttpContext.Current.User’?
谢谢。
更新:
这是注册方法:
[HttpPost] public ActionResult Register(Person person) { var q = da.Persons.Where(x => x.LoginName == person.LoginName.ToLower()).FirstOrDefault(); if (q != null) { ModelState.AddModelError("", "Username is repettive, try other one"); return Json(new object[] { false, this.RenderPartialViewToString("RegisterControl", person) }); } else { if (person.LoginName.ToLower() == "admin") { person.IsAdmin = true; person.IsActive = true; } da.Persons.Add(person); da.SaveChanges(); FormsAuthentication.SetAuthCookie(person.LoginName,false); return Json(new object[] { true, "You have registered successfully!" }); } }
这是我最终使用的版本,该版本基于@ AdamTuliper- MSFT的回答。它仅应在登录后但在重定向之前使用,以允许其他代码访问HttpContext.User。
HttpContext.User
在调用SetAuthCookie()之后调用此函数,如下所示:
// in login function FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); AuthenticateThisRequest(); private void AuthenticateThisRequest() { //NOTE: if the user is already logged in (e.g. under a different user account) // then this will NOT reset the identity information. Be aware of this if // you allow already-logged in users to "re-login" as different accounts // without first logging out. if (HttpContext.User.Identity.IsAuthenticated) return; var name = FormsAuthentication.FormsCookieName; var cookie = Response.Cookies[name]; if (cookie != null) { var ticket = FormsAuthentication.Decrypt(cookie.Value); if (ticket != null && !ticket.Expired) { string[] roles = (ticket.UserData as string ?? "").Split(','); HttpContext.User = new GenericPrincipal(new FormsIdentity(ticket), roles); } } }
编辑: 删除对Request.Cookies的调用,如@ AdamTuplier-MSFT所述。