【发布时间】:2015-12-02 03:31:05
【问题描述】:
我已经打这个几个小时了,我很难过。我正在向 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 为 true 的用户,但下面的 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",
type: "POST",
dataType: "json",
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.");
});
}
【问题讨论】:
标签: .net asp.net-mvc forms-authentication httpcontext