首页 > 解决方案 > ASP.NET Core 将默认凭据传递给 HttpClient

问题描述

如何将 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;

编辑

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

编辑2

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

标签: iisasp.net-core-2.2

解决方案


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

正如 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;

        });

推荐阅读