我有一个 Blazor WebAssembly
网站,它调用 API 来读取/写入数据。身份验证基于 Identity Server
。用户通过 Identity Server 进行身份验证,并且有一个 Api 密钥(下图中的janssen_api)用于 Blazor 和 API 之间的通信。
应用中有 3 个页面。因此,用户可以点击一个页面,他会看到来自 API 的内容。
我在我所有的笔记本电脑上测试了该网站,它正在运行。当客户端开始使用时,他有一个错误。第一个页面调用API并正确显示内容。当用户点击其他页面时,发生错误。
一开始我以为是缓存浏览器的问题。但现在,我找不到解决办法。
错误如下:
<块引用>blazor.webassembly.js:1 暴击:
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常呈现组件:'janssen_api' Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenNotAvailableException: 'janssen_api' 在 Microsoft.AspNetCore.Components.WebAssembly.Authentication.AuthorizationMessageHandler.SendAsync(HttpRequestMessage 请求,CancellationToken 取消令牌)在 Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage 请求,CancellationToken 取消令牌)在 System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage 请求, HttpCompletionOption completionOption、布尔异步、布尔 发射遥测开始停止,取消令牌取消令牌)在 System.Net.Http.HttpClient.GetStreamAsyncCore(HttpRequestMessage 请求,CancellationToken 取消令牌)在 Janssen.PublicationEmea.UI.Services.GapAnalysisService.GetListWithDetails(字符串 用户名)在 Janssen.PublicationEmea.UI.Pages.GapAnalysis.GapAnalysis.OnInitializedAsync() 在 Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(任务 taskToHandle)
这两个应用程序都托管在 Azure 中。我不知道如何解决这个问题。有什么想法吗?
在 API 项目中,我添加了身份验证
services.AddAuthentication(
IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = apiSettings.Authority;
options.ApiName = apiSettings.ApiName;
options.ApiSecret = apiSettings.ApiSecret;
});
在 Blazor 中,在 Program.cs
中,我为每个类似的服务添加了一个 HttpClient
builder.Services.AddHttpClient<IExportService, ExportService>(
client => client.BaseAddress = new Uri($"{apiEndpoint}"))
.AddHttpMessageHandler<MyAuthorizationMessageHandler>();
这是定义
public class MyAuthorizationMessageHandler : AuthorizationMessageHandler
{
public MyAuthorizationMessageHandler(IAccessTokenProvider provider,
NavigationManager navigation, IConfiguration configuration) :
base(provider, navigation)
{
string apiEndpoint = configuration["Api:EndpointsUrl"];
string apiScope = configuration["Api:Scope"];
ConfigureHandler(authorizedUrls: new[] { apiEndpoint },
scopes: new[] { apiScope });
}
}
现在,我只能用 Chrome
中的 Incognito mode
复制该问题。我还是不知道怎么解决
问题出在 MyAuthorizationMessageHandler
中。如果我从 Program.cs
中删除它并删除 API 中的 [Authorize]
属性,我没有任何错误。现在,问题是如何添加授权。