如何将ASP.NET Core中的DefaultCredentials传递给HttpClient?
当我在Visual Studio中本地运行它时,效果很好。当前用户有权请求“ www.mycompany.com”。但是,一旦我将其发布到IIS,我就会收到401(未授权)信息,因为HttpClient在DefaultCredentials中获得了Web服务器用户(未经授权)。
Windows身份验证在Visual Studio和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。 仅授权本地用户发出请求
我知道它在本地由当前用户运行,但是我不知道如何授权应用程序池...
正如戳和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;
});