gpt4 book ai didi

ajax - Nancy 中的表单验证不适用于 AJAX 登录请求

转载 作者:行者123 更新时间:2023-12-05 01:07:08 24 4
gpt4 key购买 nike

我正在尝试使用 Nancy 作为 ASP.NET MVC 的替代方案来实现一个非常简单的峰值。

它应该采用用户名(无密码)并在同一登录页面上提供有意义的错误消息,而无需刷新。如果登录成功,响应将包含要导航到的 URL。

响应的 POCO 如下所示:

public class LoginResponseModel
{
public bool IsSuccess { get; set; }
public string RedirectUrl { get; set; }
public string ErrorMessage { get; set; }
}

登录请求的 JS 处理程序:
$.ajax({
url: '/login',
type: "POST",
data: { UserName: username }
}).done(function (response) {
if (response.IsSuccess) {
showSuccess();
document.location.href = response.RedirectUrl;
return;
}
showError(response.ErrorMessage);
}).fail(function (msg) {
showError("Unable to process login request: " + msg.statusText);
});

我遇到的问题是 Nancy 基于表单的身份验证。我已经浏览了六个不同的教程,这些教程或多或少都在做同样的事情,还浏览了 Nancy 身份验证演示。他们都有一个共同点,那就是他们都依赖于 LoginAndRedirect扩展方法。我不想返回重定向。我想返回登录尝试的结果并让客户端处理导航。

我正在使用的 IUserMapper 实现:
public class UserMapper : IUserMapper
{
public IUserIdentity GetUserFromIdentifier(Guid identifier, NancyContext context)
{
// Don't care who at this point, just want ANY user...
return AuthenticatedUser {UserName = "admin"};
}
}

我的 LoginModule 操作的相关部分:
var result = _userMapper.ValidateUser(input.AccessCode);

if (result.Guid != null) this.Login(UserMapper.GUID_ADMIN, expiry);

return Response.AsJson(result.Response);

但对于后续请求 Context.CurrentUser始终为空。

如果我将以下方法添加到 Nancy.Demo.Authentication.Forms 示例中,它会重现我在我自己的项目中看到的行为,让我相信 LoginWithoutRedirect 不会按我的预期工作。
Get["/login/{name}"] = x =>
{
Guid? userGuid = UserDatabase.ValidateUser(x.Name, "password");
this.LoginWithoutRedirect(userGuid.Value, DateTime.Now.AddYears(2));
return "Logged in as " + x.Name + " now <a href='~/secure'>see if it worked</a>";
};

最佳答案

问题原来是Context.CurrentUser如果您不返回 NancyModule.Login(),FormsAuthentication 依赖于未设置的 cookie。回复。

var result = _userMapper.ValidateUser(input.AccessCode);             
if (result.IsSuccess) {
this.LoginWithoutRedirect(result.Guid);
}
return Response.AsJson(result);

在本例中, LoginWithoutRedirect调用返回 Response带有 cookie 集的对象。为了在 Ajax 场景中处理这个问题,我不得不向 LoginAjaxResponse 添加一个 AuthToken 属性。类,然后像这样传递cookie:
var result = _userMapper.ValidateUser(input.AccessCode);             
var response = Response.AsJson(result);
if (result.IsSuccess) {
var authResult = this.LoginWithoutRedirect(result.Guid);
result.AuthToken = authResult.Cookies[0].Value;
}
return Response.AsJson(result);

在客户端,Ajax 响应处理程序更改为(假设使用 jQuery cookie plugin :
$.ajax({
url: '/login',
type: "POST",
data: { UserName: username }
}).done(function (response) {
if (response.IsSuccess) {
showSuccess();
$.cookie("_ncfa", response.AuthToken); // <-- the magic happens here
document.location.href = response.RedirectUrl;
return;
}
showError(response.ErrorMessage);
}).fail(function (msg) {
showError("Unable to process login request: " + msg.statusText);
});

AuthToken 是经过加密和 base64 编码的 GUID。带有 this.RequiresAuthentication() 的后续请求enabled 将首先检查此身份验证 token cookie。
  • 如果不存在“_ncfa”cookie,则UserMapperGetUserFromIdentifier()永远不会被调用。
  • 如果值在 Context.Request.Cookies["_ncfa"] base64 解码和解密时不会产生有效的 GUID,GetUserFromIdentifier()永远不会被调用。
  • GetUserFromIdentifier()不叫,Context.CurrentUser从未设置。

  • 如果您想要工作示例的源代码,请访问 GitHub .

    关于ajax - Nancy 中的表单验证不适用于 AJAX 登录请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19022356/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com