Iis ASP.NET Core将默认凭据传递给HttpClient

Iis ASP.NET Core将默认凭据传递给HttpClient,iis,asp.net-core-2.2,Iis,Asp.net Core 2.2,如何将ASP.NET核心中的DefaultCredentials传递给HttpClient 当我在VisualStudio中本地运行它时,它工作正常。当前用户有权请求www.mycompany.com。但是,一旦我将其发布到IIS,就会得到一个401未经授权的证书,因为HttpClient在DefaultCredentials中获取未经授权的web服务器用户 Windows身份验证在VisualStudio和IIS中处于活动状态 我的c代码: HttpClient Client = new Ht

如何将ASP.NET核心中的DefaultCredentials传递给HttpClient

当我在VisualStudio中本地运行它时,它工作正常。当前用户有权请求www.mycompany.com。但是,一旦我将其发布到IIS,就会得到一个401未经授权的证书,因为HttpClient在DefaultCredentials中获取未经授权的web服务器用户

Windows身份验证在VisualStudio和IIS中处于活动状态

我的c代码:

HttpClient Client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
Client.BaseAddress = new Uri("www.mycompany.com");
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Client.DefaultRequestHeaders.Add("Application-Name", Assembly.GetExecutingAssembly().GetName().Name);

HttpResponseMessage response = Client.GetAsync("/classes").Result;
编辑

我知道它在本地使用当前用户运行,但我不知道如何授权应用程序池

编辑2

我解释得不太正确。我想通过身份验证从本地用户传递到HttpClient。只有本地用户才有权提出请求

我知道它在本地使用当前用户运行,但我不知道如何授权应用程序池

正如poke和lex所说,如果您托管在IIS上,DefaultCredentials将是应用程序池标识,而不是用户帐户

如果您想知道如何修改应用程序池标识,我建议您可以执行以下步骤:

1.打开IIS管理控制台

2.选择应用程序池和高级设置

3.修改应用程序池标识以使用自定义域帐户

更新:


如果您想使用登录用户凭据来访问其他api,我可以尝试使用


使用WebClient和HttpClient之间的行为似乎有所不同

请尝试使用WebClient。它似乎为子请求提供了正确的凭据,而HttpClient不允许在模拟时生成子线程


Andreas Kroll

当您使用Visual Studio运行它时,您就是在使用当前用户运行它。部署到IIS时,将使用应用程序池标识运行此操作。您需要向目标系统授权应用程序池标识,或者更改应用程序池运行时使用的用户。您应该注意到有很多关键差异,“我想通过本地用户到HttpClient的身份验证传递。”—然后您需要授权。这是一件非常不同的事情,需要对Kerberos身份验证进行一些复杂的设置。这不是我想要的。我想通过本地用户到httpclient的身份验证如果您想使用登录用户凭据访问其他api,我可以尝试使用模拟。你好,Brando。我已经尝试过了,但随后出现了以下错误:这通常是主机名解析过程中出现的临时错误,意味着当您发送请求时,localIt应该使用ip地址而不是域。现在我再次获得状态代码:401,原因短语:“Unauthorized”。但是模拟是有效的。这里还有两种解决方案,NET 4.6和.NET核心:和
        var user = (WindowsIdentity)User.Identity;


        WindowsIdentity.RunImpersonated(user.AccessToken, () =>
        {
            var impersonatedUser = WindowsIdentity.GetCurrent();
            var message =
                $"User: {impersonatedUser.Name}\t" +
                $"State: {impersonatedUser.ImpersonationLevel}";

            //ViewBag.UseImper = message;

            HttpClient Client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
            //Client.BaseAddress = new Uri("http://localhost:44331");
            Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            Client.DefaultRequestHeaders.Add("Application-Name", Assembly.GetExecutingAssembly().GetName().Name);

            var response = Client.GetAsync("http://127.0.0.1:44319/api/values").Result;

            int i = 0;

        });