#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. Сеансы входа в систему не должны храниться в течение нескольких дней. Этот метод также сохраняет ваш предварительный режим.