我已经打了几个小时,我被困了.我正在向MVC 5控制器发出一个ajax发布请求,试图自动登录一个特定的预定义的“超级”用户.在控制器方法中,我试图通过编程方式设置HttpContext.Current.User并进行身份验证,所以超级用户可以跳过手动登录的过程.这个共识似乎在这里,我实现了:
setting HttpContext.Current.User
这似乎有效,直到我尝试使用自定义AuthorizeAttribute查看任何其他控制器方法.
控制器方式:
[HttpPost] [AllowAnonymous] public ActionResult Login(string username) { string password = ConfigurationManager.AppSettings["Pass"]; User user = service.Login(username,password); 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(','); System.Web.HttpContext.Current.User = new GenericPrincipal(new FormsIdentity(ticket),roles); } } //...processing result return Json(result); }
上面的service.Login方法创建了cookie:
FormsAuthentication.SetAuthCookie(cookieValue,false);
虽然我设置了具有Identity和IsAuthenticated的用户,但下面的filterContext.HttpContext.User不是同一个用户.它基本上是空的,好像它从未被分配,并且没有被认证.
public override void OnAuthorization(AuthorizationContext filterContext) { string[] userDetails = filterContext.HttpContext.User.Identity.Name.Split(char.Parse("|")); }
我找到的最近的帖子是:IsAuthenticated works on browser – but not with Air client!
但是,针对我的修复已经到位了:
<authentication mode="Forms"> <forms cookieless="UseCookies" timeout="60" loginUrl="~/Account/Login" /> </authentication>
我使我的AuthorizationContext.User与我在控制器中验证的HttpContext.Current.User相匹配?
更新:
我意识到我需要一个重定向来正确设置cookie,我只是不能通过ajax调用远程完成该工作.在站点B上执行控制器方法时,站点A中的脚本是什么样的.此重定向不会设置会话.在下一个控制器方法上验证用户时仍然不存在.它只是将我重定向到登录视图.
function remoteLogin(id) { $.ajax({ url: "/MyController/RemoteLogin",type: "POST",dataType: "json",data: { "id": id } }).done(function (data) { if (data) { if (data.user) { var user = data.user; $.ajax({ url: "http://siteB.xyz/Account/Login",data: { "username": user.username,"password": user.password } }).done(function (data) { if (data) { window.location.href = "http://siteB.xyz/Next" } else { alert("Fail."); } }).fail(function (data) { alert("Fail."); }); } else { alert("Fail."); } } }).fail(function (data) { alert("Fail."); }); }