Выйдите из системы с помощью AuthenticationStateProvider и установите для параметра User.Identity.IsAuthenticated значение false, используя Blazor. - PullRequest
3 голосов
/ 22 марта 2020

Я унаследовал веб-сайт, написанный на Blazor и. NET Core 3.1, и мне нужно предоставить пользователю кнопку «Выйти». Веб-сайт использует пользовательскую реализацию AuthenticationStateProvider со следующим методом GetAuthenticationStateAsync():

public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
    ClaimsIdentity identity = new ClaimsIdentity();

    if (_currentUser != null)
    {
        identity = GenerateClaimsForCurrentUser();
    }
    else
    {
        try
        {
            var user = await sessionStorage.GetItemAsync<Credentials>("User");
            if (user != null && await IsAuthentic(user))
            {
                _currentUser = await UserInfo(user);
                identity = GenerateClaimsForCurrentUser();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    return new AuthenticationState(new ClaimsPrincipal(identity));
}

Чтобы убедиться, что пользователь вошел в систему, код:

AuthenticationState authState = await authenticationState.GetAuthenticationStateAsync();
ClaimsPrincipal principal = authState.User;

if (principal.Identity.IsAuthenticated)
{
    ...
}

Проблема в написанном мною методе Logout(), который выполняется при нажатии на ссылку «Выйти». Я удаляю сеанс «Пользователь» из хранилища сеансов Blazor, но когда вызывается principal.Identity.IsAuthenticated, он по-прежнему возвращается как true?

Кто-нибудь знает, как я могу установить IsAuthenticated в false при выходе из системы?

1 Ответ

4 голосов
/ 22 марта 2020

В принципе ваш метод GetAuthenticationStateAsync должен быть похож на этот:

 public override async Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var token = await GetTokenAsync();
        var identity = string.IsNullOrEmpty(token)
            ? new ClaimsIdentity()
            : new ClaimsIdentity(GenerateClaimsForCurrentUser(), "jwt");
        return new AuthenticationState(new ClaimsPrincipal(identity));
    }

Примечание. Метод GetTokenAsync извлекает токен JWT из локального хранилища. Если он пуст, вы создаете новый объект ClaimsIdentity без претензий. Если он не пустой, вы создаете новый объект ClaimsIdentity, который содержит предоставленные ему утверждения, и этот объект передается конструктору ClaimsPrincipal.

...