我試圖用南希作爲ASP.NET MVC的替代品來實現一個非常簡單的秒殺。南希的表單驗證不能與AJAX登錄請求一起工作
它應該使用用戶名(無密碼)並在同一登錄頁面上提供有意義的錯誤消息,而不需要刷新。如果登錄成功,則響應包含要導航到的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);
});
我遇到的問題是與南希的基於表單的身份驗證。我已經瀏覽了六本不同的教程,這些教程幾乎都做了同樣的事情,並且通過了南希認證演示。他們都有一個共同點,那就是他們依賴於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>";
};
您也可以在響應中設置cookie,以避免必須將其設置在客戶端中。 例如: foreach(var c in authResult.Cookies)response.Cookies.Add(c); –