Blazor 在页面之间丢失身份验证

时间:2021-06-24 16:02:24

标签: c# blazor blazor-webassembly

我有一个 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)

enter image description here

这两个应用程序都托管在 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 中的 Incognito mode 复制该问题。我还是不知道怎么解决

更新 3

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

0 个答案:

没有答案