从MVC应用程序调用的Web API集成Windows身份验证(Call Web API from

2019-09-26 19:44发布

我有一个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;
        }
    }

Answer 1:

没有更多的信息很难肯定地说,但问题可能是由于您正在尝试双跳认证。

  1. 客户端应用程序(浏览器在一个网站的情况下)来认证客户端发送用户
  2. 认证服务器(MVC应用程序)
  3. 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基于回调的代码行,并与几个核心异步方法取代它。 目前仍然还有更多的清理可以做的,但在功能上,这是足够的。



Answer 2:

在没有看到代码很难说。 你试过没有设定Credentials参数? 我会跑提琴手和比较由MVC应用程序和邮递员发送的请求。



Answer 3:

您可以了解如何在这个GitHub的讨论页模仿一个已经认证(窗口)用户: https://github.com/aspnet/Home/issues/1805

ilanc与朝底部的链接一个很好的示范。



文章来源: Call Web API from MVC Application with Integrated Windows Authentication