Blazor WA 托管 - Azure 应用服务上未授权 401

Posted

技术标签:

【中文标题】Blazor WA 托管 - Azure 应用服务上未授权 401【英文标题】:Blazor WA hosted - 401 Unauthorized on Azure AppService 【发布时间】:2021-02-14 19:59:09 【问题描述】:

我有一个来自模板的简单 Blazor 应用程序。你可以在这里检查它:https://blazorfun2.azurewebsites.net/。 FetchData 页面仅适用于授权用户,但当我授权时,我得到401 Unauthorized error。在 Response 标头下显示此错误:

WWW-Authenticate: Bearer error="invalid_token", error_description="发行者 'https://blazorfun2.azurewebsites.net' 无效"

您可以使用testmail@testmail.somethingError#2 密码进行测试。

我在本地主机上没有这个错误。

我在 Linux 上使用 Azure 应用服务,dotnet 5.0。

可以通过更改IssuerUri (source) 来解决,但我想这不是最好的选择..

//Main method in Program.cs in Client: 
 var builder = WebAssemblyHostBuilder.CreateDefault(args);
 builder.RootComponents.Add<App>("#app");

 builder.Services.AddHttpClient("BlazorPlaygroundFun.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
     .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

 // Supply HttpClient instances that include access tokens when making requests to the server project
 builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("BlazorPlaygroundFun.ServerAPI"));

 builder.Services.AddApiAuthorization();

 await builder.Build().RunAsync();
//startup.cs in server project:
services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection")));

services.AddDatabaseDeveloperPageExceptionFilter();

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

services.AddAuthentication()
    .AddIdentityServerJwt();

services.AddControllersWithViews();
services.AddRazorPages();

这里有什么问题?谢谢!

【问题讨论】:

这是this 的副本吗?否则,你检查the other questions and answers on SO了吗? 这些问题是相关的,是的。但不适用于 blazor,也不适用于只是模板的简单应用程序。 您的问题解决了吗?有进展吗? 【参考方案1】:

登录成功后,调用

var token = await TokenProvider.GetTokenAsync(); 

获取 jwt 令牌的方法。

然后在 Fetch Data 中,将 jwt 令牌带入 header,这将解决您的问题。

更多详情请查看相关帖子。

感谢enet的回答。

Blazor WebAssembly 401 Unauthorized even when I am authorized

【讨论】:

更改发行人 uri 就像一个糟糕的选择。但这并不好 - 我必须编辑每个授权页面。我不明白为什么它只适用于本地主机..

以上是关于Blazor WA 托管 - Azure 应用服务上未授权 401的主要内容,如果未能解决你的问题,请参考以下文章

当 Azure 应用服务上的“仅 HTTPS”选项处于打开状态时,无法切换 Blazor 应用(在同一托管下)

多个 Blazor 应用程序,相同的托管。从第一个应用程序重定向到第二个应用程序。 Azure 应用服务

如何在 Azure DevOps 上为发布服务器项目而不是客户端的 Blazor WebAssembly 托管应用程序创建构建管道?

无法托管 Blazor 应用程序

Blazor 托管 - 在显示应用程序之前立即授权

如何使用 Azure AD B2C 保护 Blazor Wasm 应用访问的 Azure 函数?