c# - Blazor 在页面之间丢失身份验证
问题描述
我有一个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:Microsoft.AspNetCore.Components.WebAssembly.Authentication.AuthorizationMessageHandler 的“janssen_api”。 Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancelToken) 在 System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage request, HttpCompletionOption completionOption, Boolean async, Boolean emitTelemetryStartStop, System.Net.Http.HttpClient.GetStreamAsyncCore(HttpRequestMessage 请求,CancellationToken cancelToken) 在 Janssen.PublicationEmea.UI.Services.GapAnalysisService.GetListWithDetails(String username) 在 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 });
}
}
更新 2
现在,我只能用Chrome
in复制这个问题Incognito mode
。我仍然不知道如何解决它
更新 3
问题在MyAuthorizationMessageHandler
. 如果我从 API 的Program.cs
and remove[Authorize]
属性中删除它,我没有任何错误。现在,问题是如何添加授权。
解决方案
推荐阅读
- javascript - 如何检查从我端触发的套接字事件?
- symfony - 如何为访客帐户启用 Sulu API?
- javascript - 当文本框输入带小数的值时,在第二个文本框上显示相同的值
- java - PowerMock(ito):如何测试私有方法并在另一个私有方法中模拟公共服务
- javascript - 为什么我会收到此错误 - 'TypeError: Can only call FormData.append on instances of FormData' 即使我只使用 FormData 的实例?
- visual-studio-code - VSCode 错误命令 'Live Server: Open with Live Server' 导致错误(找不到命令'extension.liveServer.goOnline')
- javascript - 模态图像网格
- angular - 如何以角度链接嵌套的下拉列表
- excel - 从excel中的自由文本字符串中提取各种格式的日期
- javascript - 如何为 js 过滤设置动画