我的任务是开发 Blazor Webassembly 应用程序。此应用仅在公司网络内使用,出于安全原因,我们希望使用现有的 AD 和 NTLM 身份验证。
到目前为止,我在 IIS 中配置并运行了一个最小的 Blazor 应用程序。它被配置为使用 Windows 身份验证,并且到目前为止有效。当我在浏览器中打开应用程序时,我被要求提供我的凭据。 该应用程序还应与同样受 Windows 身份验证保护的 .net 核心 webapi 进行通信。这个 webapi 安全性也可以正常工作。当我在浏览器中打开一个指向它的 URL 时,我被要求提供我的凭据,并且页面会按原样加载。
现在的问题:当我使用 HttpClient.GetAsync 从 Blazor 应用程序调用相同的 url(在浏览器中有效)时,我收到“401:未授权”错误。即使应用程序本身加载了相同的身份验证。有什么我必须做的吗? MSDN 文档非常庞大,我找不到解决方案。
在 ConfigureServices() 中的 WebApi Startup.cs 中,我添加了
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization();
并在 Configure()
app.UseCors(x => x.AllowAnyMethod().AllowAnyHeader().SetIsOriginAllowed(origin => true).AllowCredentials());
app.UseAuthentication();
app.UseAuthorization();
附注: Blazor 应用程序使用 .NET Core 3.1 WebApi 使用 .NET 5.0
答案 0 :(得分:0)
我建议检查 Blazor WebAssembly additional security scenarios(所有示例都在那里)
要授权您的请求,您可以将 HttpClient 与 BaseAddressAuthorizationMessageHandler 结合使用:
builder.Services.AddHttpClient("ServerAPI",
client => client.BaseAddress = new Uri("https://www.example.com/base"))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
BaseAddressAuthorizationMessageHandler 将自动向所有传出请求添加 Authorize 标头。
注意:这仅适用于 Blazor Wasm,不适用于服务器。
答案 1 :(得分:0)
当通过 HttpClient
注入 IHttpClientFactory
时,您可以像这样注册一个使用 windows auth 的命名 HttpClient:
services.AddHttpClient("Excit", x =>
{
//other settings
}).ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler
{
UseDefaultCredentials = true
};
});