Я разработал сайт, который использует аутентификацию OWIN. Все работало хорошо, но внезапно, без какого-либо изменения кода, аутентификация сайта перестала работать. Когда я ввожу имя пользователя и пароль, вызов SignInManager.PasswordSignInAsync
завершается успешно, но User.Identity.IsAuthenticated
остается false
.
Это Startup.Auth.cs:
public partial class Startup
{
// For more information on configuring authentication, please visit https://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
// Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
// Enables the application to remember the second login verification factor such as phone or email.
// Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
// This is similar to the RememberMe option when you log in.
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
// Uncomment the following lines to enable logging in with third party login providers
//app.UseMicrosoftAccountAuthentication(
// clientId: "",
// clientSecret: "");
//app.UseTwitterAuthentication(
// consumerKey: "",
// consumerSecret: "");
//app.UseFacebookAuthentication(
// appId: "",
// appSecret: "");
//app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
//{
// ClientId = "",
// ClientSecret = ""
//});
}
}
Вот где выполняется аутентификация:
public override Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
var result = base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout).Result;
if (result == SignInStatus.Success)
{
ApplicationUser user = this.UserManager.FindAsync(userName, password).Result;
user.LastLoggedOn = DateTime.Now;
if (!user.FirstLoggedOn.HasValue)
user.FirstLoggedOn = user.LastLoggedOn;
this.UserManager.UpdateAsync(user);
}
return Task.FromResult(result);
}
Одна вещь, которую нужно отметить. Я использую этот же код на других сайтах и во всех аутентификации работает. Только один сайт имеет эту проблему.
Это метод входа Accountcontroller:
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<JsonResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
var mensaje = GetModelErrorMessages();
return Json(mensaje, JsonRequestBehavior.AllowGet);
}
if (String.IsNullOrEmpty(returnUrl))
returnUrl = "/";
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return Json(returnUrl, JsonRequestBehavior.AllowGet);
case SignInStatus.LockedOut:
return Json("ERROR: El usuario está bloqueado.", JsonRequestBehavior.AllowGet);
case SignInStatus.RequiresVerification:
return Json(Url.Action("SendCode", new { ReturnUrl = returnUrl, model.RememberMe }));
case SignInStatus.Failure:
default:
var mensaje = "ERROR: Nombre de usuario o contraseña incorrectos.";
return Json(mensaje, JsonRequestBehavior.AllowGet);
}
}
Как видите, это возвращает JSON. JSON содержит URL-адрес возврата, который используется для перенаправления на другой URL-адрес, как показано в этом сценарии:
function performLogin(loginUrl)
{
runWaitMe('#loginform', "Ingresando...");
$.ajax({
type: 'POST',
url: loginUrl,
data: $('#frmLogin').serialize()
}).done(function (data) {
if (displayError(data))
hideWaitMe('#loginform');
else
location.href = data;
}).fail(function (jqXHR) {
hideWaitMe('#loginform');
showError(jqXHR);
});
}
Повторяю, этот код присутствует на всех разрабатываемых мной сайтах, и он работает для всех них. .
Может быть, для этого случая повар ie не может быть сохранен.
Что я могу проверить?
С уважением, Хайме