HttpClient.По умолчанию требуются исполнители.Разрешение равно нулю?

#authorization #blazor #blazor-server-side

Вопрос:

Я получаю токен и добавляю его в заголовок авторизации введенного HttpClient:

     public MyAuthenticationService(HttpClient globalHttpClient)
    {
        _globalHttpClient = globalHttpClient;
    }

    public void Login(..)
    {
        ..
        ((AuthStateProvider)_authenticationStateProvider).NotifyUserAuthentication(token);
        AddAccessTokenToHttpClientHeader(token);
    }

    private void AddAccessTokenToHttpClientHeader(string accessToken)
    {
        _globalHttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
    }
 

Пока все хорошо, я проверил, и маркер и заголовки установлены. Но затем мой первый вызов api в другой службе:

 var test = _httpClient.DefaultRequestHeaders.Authorization; // test is null!
return await ApiUtils.GetList<T>(_httpClient, uri, _logger); // Error: 401
 

Это другой HttpClient или что-то в этом роде? Я ввел его нормально. В Startup.cs у меня есть эта строка:

 services.AddHttpClient();
 

Ответ №1:

Я заставил его работать, но он далек от идеала. Я установил режим визуализации в _Host.cshtml в:

 render-mode="Server"
 

а затем я установил его вручную:

 string? token = await _localStorageService.GetItemAsync<string>(Constants.LocalStorage.ACCESS_TOKEN_KEY);
if (!HttpClient.DefaultRequestHeaders.Contains("Authorization") || HttpClient.DefaultRequestHeaders.Authorization == null)
                HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
return await ApiUtils.StaticConsumeGetList<T>(HttpClient, uri, _logger);
 

Я надеюсь, что у кого-то есть лучшее решение.

Обновить:

По-видимому, это работает совершенно по-другому на сервере Blazor по сравнению с WASM. Вы не можете (и, вероятно, не должны) извлекать токены из локального хранилища в OnAfterRenderAsync (), поэтому вы должны добавить и получить аутентификацию отamp;к HttpContextAccessor.HttpContext вместо этого использует промежуточное программное обеспечение. Это, однако, создает проблему, из-за которой новые вкладки и закрытие браузера также убивают сеанс входа в систему, но это предназначенный способ для серверных приложений Blazor. Сеансы входа в систему не должны храниться в течение нескольких дней. Этот метод также сохраняет ваш предварительный режим.