【问题标题】:ASP.NET Core pass default credentials to HttpClientASP.NET Core 将默认凭据传递给 HttpClient
【发布时间】:2020-03-22 13:17:18
【问题描述】:

如何将 ASP.NET Core 中的 DefaultCredentials 传递给 HttpClient?

当我在 VisualStudio 中本地运行它时,它工作正常。当前用户有权请求“www.mycompany.com”。但是一旦我将它发布到 IIS,我就会得到 401(未授权),因为 HttpClient 在 DefaultCredentials 中获取了 web-server-user(未授权)。

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;

编辑

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

EDIT2

我没有完全正确地解释它。我想将本地用户的身份验证传递给 HttpClient。 只有本地用户有权提出请求

【问题讨论】:

  • 当您使用 Visual Studio 运行它时,您正在使用当前用户运行它。当您部署到 IIS 时,这是使用应用程序池标识运行的。您需要向目标系统授权应用程序池身份,或者更改运行应用程序池的用户。
  • 您应该注意很多关键差异blog.lextudio.com/…
  • “我想将本地用户的身份验证传递给 HttpClient。” – 你需要委托。这是完全不同的事情,需要对 Kerberos 身份验证进行一些复杂的设置。

标签: iis asp.net-core-2.2


【解决方案1】:

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

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

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

1.打开IIS管理控制台。

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

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


更新:

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

        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;

        });

【讨论】:

  • 我的表达有误。这不是我想要的。我想将本地用户的身份验证传递给 HttpClient
  • 如果你想在用户凭证中使用登录来访问其他api,我可以尝试使用模拟。
  • 你好白兰度。我已经尝试过了,但随后出现以下错误:This is usually a temporary error during hostname resolution and means that the local
  • 发送请求时应该使用ip地址而不是域。
  • 现在我又收到了StatusCode: 401, ReasonPhrase: 'Unauthorized'。但模仿有效。
【解决方案2】:

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

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

安德烈亚斯·克罗尔

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多