OWIN-аутентификация успешна, но User.Identity.IsAuthenticated имеет значение false - PullRequest
0 голосов
/ 21 февраля 2020

Я разработал сайт, который использует аутентификацию 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 не может быть сохранен.

Что я могу проверить?

С уважением, Хайме

1 Ответ

0 голосов
/ 18 апреля 2020

Оказалось, что даже при успешной аутентификации User.Identity.IsAuthenticated остается ложным до следующего запроса.

Мне нужно выполнить перенаправление, если я планирую что-то сделать со свойством User.Identity.IsAuthenticated.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...