gpt4 book ai didi

c# - Blazor WebAssembly - 页面刷新时未调用 GetAuthenticationStateAsync()

转载 作者:行者123 更新时间:2023-12-05 04:47:00 25 4
gpt4 key购买 nike

我的 Blazor WebAssembly 应用程序中有自定义 AuthenticationStateProvider,它不会在页面刷新时调用 GetAuthenticationStateAsync 方法,因此如果用户已登录,然后他们手动刷新页面 ClaimsPrincipal 未填充 AuthenticationState,因此无法授权用户。我正在使用保存在 cookie 中的 JWT 进行身份验证,并且该 cookie 在页面刷新后仍然存在,应用程序只是不调用 GetAuthenticationStateAsync(如果我正确学习了 blazor,它应该在页面刷新时调用)。

这是我的自定义 AuthenticationStateProvider:

public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly HttpClient _httpClient;
public CustomAuthenticationStateProvider(
IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient("APIClient");
}

public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{

//TODO get token from cookie
var savedToken = "";

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

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

public void MarkUserAsAuthenticated(string email)
{
var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, email) }, "apiauth"));
var authState = Task.FromResult(new AuthenticationState(authenticatedUser));
NotifyAuthenticationStateChanged(authState);
}

public void MarkUserAsLoggedOut()
{
var anonymousUser = new ClaimsPrincipal(new ClaimsIdentity());
var authState = Task.FromResult(new AuthenticationState(anonymousUser));
NotifyAuthenticationStateChanged(authState);
}
}

编辑:它一直在调用 GetAuthenticationStateAsync 方法,这只是令人困惑,因为我在调试器中,它从未在该方法内遇到我的断点,这是我看到其他人的问题(仍然不确定为什么会这样)。

最佳答案

这取决于您在哪里调用 GetAuthenticationStateAsync
即在 BlazorHero 项目中,此调用出现在 MainLayout.razor 中:

</NotAuthorized>
<Authorized>
@(LoadDataAsync())
<MudLayout RightToLeft="@_rightToLeft">

MainLayout.razor.cs 中:

private async Task LoadDataAsync()
{
var state = await _stateProvider.GetAuthenticationStateAsync();
var user = state.User;
if (user == null) return;

所以我认为您需要检查它的调用位置。

MainLayout 会在您每次加载页面时呈现。

更好的解决方案(更干净)是在 AfterRender 中添加此代码,例如:

protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await LoadDataAsync();
}
}

关于c# - Blazor WebAssembly - 页面刷新时未调用 GetAuthenticationStateAsync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68649198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com