AspNetCore WebApp 未将用户 Windows 凭据传递给 API

问题描述 投票:0回答:1

我正在构建一个简单的 AspNetCore Balzor 服务器应用程序,它调用 AspNetCore Web Api 的端点。两者都托管在 Windows 服务器上的 IIS 中。

当我通过 IIS Express 在本地运行网站(指向托管 api)时,一切都按预期运行。如果我启动托管网站,我会收到“HHTP 错误 401.2 - 未经授权”。

这让我相信这是一个双跳问题,但我真的不知道如何解决它。

有人能指出我正确的方向吗?

这是设定

  • 两者都将服务器上的 IIS 身份验证设置为“Windows 身份验证”。
  • 两者在 Program.cs 中都有“builder.Services.AddAuthentication(NegotiateDefaults.AuthenicationScheme)。

这些是我做过的基本测试

  • 直接从浏览器调用端点
  • 将我的Windows用户名和密码直接添加到CredentialCache中,它返回数据。
    var cache = new CredentialCache(); cache.Add(url,"Negotiate",new NewtworkCredential("username","password"); var handler = new HttpClientHandler() {Credentials = cache, PreAuthenticate = true}; var httpClient = new HttpClient(handler) {Timeout = new TimeSpan(0,0,10)}; var response = await httpClient.GetAsync(url);
asp.net-core iis blazor-webassembly windows-authentication
1个回答
0
投票

我使用 vs2022 中的模板创建了一个 Web api 并选择 windows auth 作为身份验证类型。并在 .net 7 中创建了另一个 blazor 服务器应用程序,在创建时也选择了 Windows Auth。

我在 blazor 服务器应用程序中有以下代码来调用 API,该 API 在本地端和发布到 IIS 中都运行良好。唯一的区别是在 IIS 中我需要启用 Windows 身份验证并禁用允许匿名。

@inject IHttpClientFactory ClientFactory

<div>@res</div>

@code {
    private string res;

    protected override async Task OnInitializedAsync()
    {
        forecasts = await ForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
        var request = new HttpRequestMessage(HttpMethod.Get,
            // "https://localhost:7244/WeatherForecast");
        "http://localhost:8098/WeatherForecast");

        // var client = ClientFactory.CreateClient();
        var httpClient = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true });
        var response = await httpClient.SendAsync(request);
        if (response.IsSuccessStatusCode)
        {
            res = await response.Content.ReadAsStringAsync();
        }   
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.