В настоящее время я изучаю ядро asp.net и Blazor и столкнулся с проблемой с небольшой документацией. У меня есть приложение Blazor на стороне сервера, и я выполняю аутентификацию для использования локального хранилища и ServerAuthenticationStateProvider. Этот код основан на это руководство, вот моя текущая реализация поставщика состояний:
MyAuthenticationStateProvider.cs
namespace BlazorApp
{
public class MyAuthenticationStateProvider : ServerAuthenticationStateProvider
{
private readonly HttpClient _httpClient;
private readonly ILocalStorageService _localStorage;
public MyAuthenticationStateProvider(HttpClient httpClient, ILocalStorageService localStorage)
{
_httpClient = httpClient;
_localStorage = localStorage;
}
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var savedToken = await _localStorage.GetItemAsync<string>("authToken");
if (string.IsNullOrWhiteSpace(savedToken))
{
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
}
var user = new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(savedToken), "jwt"));
return new AuthenticationState(user);
}
public void MarkUserAsAuthenticated(string token)
{
var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(token), "jwt"));
var authState = Task.FromResult(new AuthenticationState(authenticatedUser));
NotifyAuthenticationStateChanged(authState);
}
LoginControl.cs
@page "/loginControl"
@inject IAuthService AuthService
@inject NavigationManager NavigationManager
<AuthorizeView>
<Authorized>
<b>Hello, @context.User.Identity.Name!</b>
<a class="ml-md-auto btn btn-primary"
href="logout?returnUrl=/"
target="_top">Logout</a>
</Authorized>
<Authorizing>
<b>Authentication in progress</b>
</Authorizing>
<NotAuthorized>
<input type="text"
placeholder="Email"
@bind="@email" />
<input type="password"
placeholder="Password"
@bind="@password" />
<button class="ml-md-auto btn btn-primary"
@onclick="@createSession">
Login
</button>
</NotAuthorized>
</AuthorizeView>
@code {
string email = "";
string password = "";
async void createSession()
{
var loginRequest = new LoginRequest
{
Email = email,
Password = password
};
await AuthService.Login(loginRequest);
}
}
Я ожидал, что после вызова NotifyAuthenticationStateChanged(AuthState)
мой пользовательский интерфейс входа в систему обновится и содержимое <Authorized>
будет отображаться. Однако мой пользовательский интерфейс по-прежнему показывает <NotAuthorized>
содержимое. Я что-то пропустил, что связано с отправкой в основной поток ?? Я новичок во всем этом, но мой наставник упомянул, что что-то связано с этим, возможно, связано с тем, что фоновый поток не сообщает пользовательскому интерфейсу о повторном рендеринге.