我有一个MVC应用程序,并在IIS在远程服务器上托管型关联的网络API项目。 它们共享相同的应用程序池。 每当我尽量让从MVC应用程序的Web API的调用我得到一个403错误,这似乎是从由HttpClientHandler传递不正确的凭据来。 我有
UseDefaultCredentials = true
我已经尝试设置
Credentials = CredentialCache.DefaultNetworkCredentials
但是这些都使API请求要经过。
设置应用程序池用我的AD用户名/密码允许所有的API请求要经过,也可以直接调用API从邮差正常返回的数据。
我的假设是,IIS应用程序池[池名称]在请求得到转发,适当的凭证从来没有通过。 反正是有解决这个未做API不安全的(即只有一对夫妇域组应该能够访问它)?
一个电话,我从MVC应用程序对API的例子
public async Task<HttpResponseMessage> CreateIncident(Incident model)
{
using (var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true }))
{
var newIncident = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
var response = await client.PostAsync(hostUri, newIncident);
return response;
}
}
没有更多的信息很难肯定地说,但问题可能是由于您正在尝试双跳认证。
- 客户端应用程序(浏览器在一个网站的情况下)来认证客户端发送用户
- 认证服务器(MVC应用程序)
- MVC应用则试图沿该Web服务通过认证
当我需要做类似的任务,我无法得到HttpClient的工作。 我想从这个问题的一些建议的解决方案中, 如何获得的HttpClient与请求一起传递凭据? 。 虽然这是信息 - 具体而言,BlackSpy的回答这部分解释了为什么:
你所要做的就是让NTLM转发到下一个服务器,它不能做身份 - 它只能做模拟只允许您访问本地资源。
我结束了使用Web客户端(有必要定向.NET架构),在MVC应用(下载从web API文件,在这种情况下)是这样的:
private async Task GetFileAsync(Identity identity, string serviceAddress, Stream stream)
{
var windowsIdentity = Identity as WindowsIdentity;
if (windowsIdentity == null)
{
throw new InvalidOperationException("Identity not a valid windows identity.");
}
using (windowsIdentity.Impersonate())
{
using (var client = new WebClient { UseDefaultCredentials = true })
{
var fileData = await client.DownloadDataTaskAsync(serviceAddress);
await stream.WriteAsync(fileData, 0, fileData.Length);
stream.Seek(0, SeekOrigin.Begin);
}
}
}
虽然需求为目标的全面框架,可以避免这种情况的是一个.NET的核心解决方案,但它看起来像它已经从那时起加入。
添加WebClient的新合同System.Net.WebClient
这PR端口System.Net.WebClient到corefx。 该代码大多是从桌面采取然后文体清理了一下。 唯一的主要代码重写被删除数百复杂APM基于回调的代码行,并与几个核心异步方法取代它。 目前仍然还有更多的清理可以做的,但在功能上,这是足够的。
在没有看到代码很难说。 你试过没有设定Credentials
参数? 我会跑提琴手和比较由MVC应用程序和邮递员发送的请求。
您可以了解如何在这个GitHub的讨论页模仿一个已经认证(窗口)用户: https://github.com/aspnet/Home/issues/1805
ilanc与朝底部的链接一个很好的示范。