Токен аутентификации Blazor на стороне клиента истек на стороне сервера - PullRequest
0 голосов
/ 25 февраля 2020

У меня проблема с токеном на стороне клиента с аутентификацией Blazor. Я реализовал аутентификацию на основе этих сообщений в блоге, я использую проект веб-сборки.

https://chrissainty.com/securing-your-blazor-apps-introduction-to-authentication-with-blazor/

https://chrissainty.com/securing-your-blazor-apps-authentication-with-clientside-blazor-using-webapi-aspnet-core-identity/

https://chrissainty.com/securing-your-blazor-apps-configuring-role-based-authorization-with-client-side-blazor/

Почти все работает нормально, но у меня проблема. На стороне сервера срок действия маркера аутентификации истек, но на стороне клиента у меня все еще есть токен аутентификации в локальном хранилище. Моя функция получения локального состояния:

   public override async Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var savedToken = await _localStorage.GetItemAsync<string>("authToken");            

        if (string.IsNullOrWhiteSpace(savedToken))
        {
            return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
        }

        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", savedToken);

        return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(savedToken), "jwt")));
    }

Что ж, глядя на заголовок ответа, я вижу, что сервер сообщает мне, что мой локальный токен истек, но я не знаю, как получить эту информацию на стороне клиента. , Так что моя клиентская сторона говорит мне, что я аутентифицирована, а на стороне сервера - нет. Я не хочу делать запрос для проверки этого каждый раз, когда мой метод GetAuthenticationStateAsyn c запускается для ручной очистки маркера локального хранилища. Как лучше всего справиться с этим поведением? Мне не хватает что-то в моем коде?

Ответ заголовка: "www-authenticate: ошибка канала-носителя =" invalid_token ", error_description =" Срок действия токена истек в 02/24/2020 11:52:35 ' ""

Спасибо.

1 Ответ

0 голосов
/ 14 марта 2020

Я следил за теми же постами в блоге, что и вы, и, кажется, нам нужно выполнить нашу собственную проверку срока действия на стороне клиента. В ApiAuthenticationStateProvider на стороне клиента я сделал это:

public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
    var savedToken = await _localStorage.GetItemAsync<string>("authToken");
    var anonymousState = new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));

    // Not authenticated
    if (string.IsNullOrWhiteSpace(savedToken))
    {
        return anonymousState;
    }

    var claims = ParseClaimsFromJwt(savedToken);
    // Checks the exp field of the token
    var expiry = claims.Where(claim => claim.Type.Equals("exp")).FirstOrDefault();
    if (expiry == null)
        return anonymousState;

    // The exp field is in Unix time
    var datetime = DateTimeOffset.FromUnixTimeSeconds(long.Parse(expiry.Value));
    if (datetime.UtcDateTime <= DateTime.Now)
        return anonymousState;

    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", savedToken);

    return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(claims, "jwt")));
}

Это не красиво, но на данный момент оно выполняет свою работу.

...