Я пытаюсь создать функцию автоматического входа в свое веб-приложение blazor. Веб-приложение открывается с пустым экраном под названием ResolveAuthorization, который выглядит следующим образом:
@page "/"
@layout EmptyLayout
@inject NavigationManager NavigationManager
@inject IMemoryCache MemoryCache
@code {
protected override void OnInitialized() {
base.OnInitialized();
string? token;
bool tokenPresent = MemoryCache.TryGetValue("token", out token); // Here the token is null
if ( tokenPresent )
NavigationManager.NavigateTo("menu");
else
NavigationManager.NavigateTo("signin");
}
}
Экран входа вызывает службу при отправке, класс с этим методом в этой службе выглядит следующим образом:
public class AuthorizationService : IAuthorizationService {
private readonly HttpClient _httpClient;
private readonly IMemoryCache _memoryCache;
public AuthorizationService(HttpClient httpClient, IMemoryCache memoryCache) {
_httpClient = httpClient;
_memoryCache = memoryCache;
}
public async Task<(bool, string?)> Signin(SigninDto input) {
var response = await _httpClient.PostAsJsonAsync("api/user/signin", input);
string content = await response.Content.ReadAsStringAsync();
if ( response.IsSuccessStatusCode == false ) {
return (false, ErrorDto.FromJson(content)!.ErrorMessage);
}
TokenDto token = TokenDto.FromJson(content)!;
_memoryCache.Set("token", token.Token, token.Role == "Admin" ? TimeSpan.FromDays(1) : TimeSpan.FromDays(30));
string? foundToken;
_memoryCache.TryGetValue("token", out foundToken); // Here the token is not null
return (true, token.Token);
}
}
Для получения дополнительной информации. В моем запуске я регистрирую свое кэширование и AuthorizationService следующим образом:
builder.Services.AddMemoryCache();
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddScoped<IAuthorizationService, AuthorizationService>();
Моя проблема в том, что в TryGetValue в ResolveAuthorizationScreen всегда возвращается значение null, и я не знаю, почему. Я предполагаю, что это как-то связано с тем фактом, что кеш памяти является одноэлементным экземпляром, и что-то идет не так, потому что я ввожу в два разных места. Что я делаю неправильно и как это исправить, чтобы TryGetValue не возвращал false, когда я ожидаю, что он вернет true?
@fuzzybear, когда я запускаю свое веб-приложение, оно открывается на этот экран и перенаправляет меня на страницу входа, как и ожидалось. Когда я вхожу в систему, а затем возвращаюсь к корневому экрану, он снова перенаправляет меня на страницу входа. Но во втором случае аутентификация уже завершена.
если мы удалим авторизацию из уравнения и установим кеш, он там?
@fuzzybear, извините за задержку. Да, когда я устанавливаю его перед TryGetValue, он там.
Я понял, что MemoryCache — это временное хранилище на время жизни программы. Вместо этого я использовал localStorage, и это было решением.
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
ваша корневая страница запускается до завершения вашей аутентификации, поэтому она всегда будет нулевой, вам нужно подключить поставщика состояния аутентификации и дождаться завершения аутентификации