ASP.CORE LogOut / SignOut. Выход из аккаунта - Андрей Моряков

ASP.CORE LogOut / SignOut. Выход из аккаунта

Добавлено: 30 Января 2018 в 13:14,  Категория: .NET CORE

Если мы создаем в asp.core 2 проект не как Empty, а как готовый шаблон "Web Application", то будет создан контроллер AccountController со множеством действий, одно из них это Logout.

Но из коробки оно не всегда работает. То есть вы нажимаете на клиентской стороне кнопку "Выход" но результата не будет.

Сейчас я расскажу почему.

Задача/challenge

ASP.CORE не работает выход, действие Logout, не работает SignOutAsync
SignOutAsync doesn't work

Решение/solution

Я перепишу свой метод Logout так, что явно укажу какую схему использовать:

        public async Task<IActionResult> Logout()
        {
            await _signInManager.Context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            _logger.LogInformation("User logged out.");
            return RedirectToAction(nameof(HomeController.Index), "Home");
        }

Объяснение/explanation

Как выглядит автоматически генерируемое действие Logout контроллера AccountController в asp.core 2 Вот так:

        public async Task<IActionResult> Logout()
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            return RedirectToAction(nameof(HomeController.Index), "Home");
        }

Вроде кажется всё хорошо, разработчики Microsoft даже не делают каких-либо дополнительных проверок. Код должен работать однозначно, но не всегда.

Если посмотреть исходники метода Logout, то увидим следующее:

    /// <summary>Signs the current user out of the application.</summary>
    public virtual async Task SignOutAsync()
    {
      SignInManager<TUser> signInManager = this;
      await signInManager.Context.SignOutAsync(IdentityConstants.ApplicationScheme);
      await signInManager.Context.SignOutAsync(IdentityConstants.ExternalScheme);
      await signInManager.Context.SignOutAsync(IdentityConstants.TwoFactorUserIdScheme);
    }

Тут инкапсулируются методы которые уже выполняют наш Logout. В отличие от метода Logout в контроллере AccountController, мы видем, что тут передаются дополнительные параметры: например csharpIdentityConstants.ApplicationScheme

Если посмотреть исходники этих свойство, то:

/// <summary>
  /// Represents all the options you can use to configure the cookies middleware uesd by the identity system.
  /// </summary>
  public class IdentityConstants
  {
    private static readonly string CookiePrefix = "Identity";
    /// <summary>
    /// The scheme used to identify application authentication cookies.
    /// </summary>
    public static readonly string ApplicationScheme = IdentityConstants.CookiePrefix + ".Application";
  ...

А я в своем проекте для определения схемы аутентификации использую схему:

CookieAuthenticationDefaults.AuthenticationScheme

Поэтому я должен явно указать какую схему использовать.

Подобная ситуация происходит при авторизации через социальные сети метод: ExternalLoginCallback

Комментарии ()