使用 Blazor 和 .Net Core WebApi 进行 Windows 身份验证

时间:2021-01-15 16:08:10

标签: asp.net-core authentication asp.net-web-api .net-core blazor

我的任务是开发 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

2 个答案:

答案 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
    };
});