我正在尝试使用 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>";
};