首页 > 解决方案 > 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.csHttpClient为每个这样的服务添加了一个

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

现在,我只能用Chromein复制这个问题Incognito mode。我仍然不知道如何解决它

更新 3

问题在MyAuthorizationMessageHandler. 如果我从 API 的Program.csand remove[Authorize]属性中删除它,我没有任何错误。现在,问题是如何添加授权。

标签: c#blazorblazor-webassembly

解决方案


推荐阅读