iis ASP.NET核心将默认凭据传递给HttpClient

nafvub8i  于 2022-12-13  发布在  .NET
关注(0)|答案(2)|浏览(157)

如何将ASP.NET核心中的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。只有本地用户有权发出请求

efzxgjgh

efzxgjgh1#

我知道它在本地以当前用户身份运行,但我不知道如何授权应用程序池...
正如普克和莱克斯所说,如果你托管在IIS上,DefaultCredentials将是应用程序池的身份而不是用户帐户。
如果你想知道如何修改应用池标识,我建议你可以按照下面的步骤:
1.打开IIS管理控制台。
2.选择应用程序池与高级设置

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

更新:
如果您想使用登录用户凭据来访问其他API,我可以尝试使用模拟。

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;

        });
huwehgph

huwehgph2#

使用WebClient和HttpClient之间似乎存在行为差异。
请尝试使用WebClient。它似乎为子请求给予了正确的凭据,而HttpClient在模拟时不允许派生子线程。

相关问题