簡體   English   中英

從具有集成Windows身份驗證的MVC應用程序調用Web API

[英]Call Web API from MVC Application with Integrated Windows Authentication

我有一個MVC應用程序和一個關聯的Web API項目,它們都托管在IIS的遠程服務器上。 它們共享相同的應用程序池。 每當我嘗試從MVC應用程序調用Web API時,都會收到403錯誤,這似乎是由於HttpClientHandler傳遞的憑據錯誤所致。 我有

UseDefaultCredentials = true 

我已經嘗試設置

Credentials = CredentialCache.DefaultNetworkCredentials

但這些都不允許API請求通過。

將應用程序池設置為使用我的AD用戶名/密碼可以允許所有API請求通過,並且還可以直接從Postman調用API來正確返回數據。

我的假設是IIS AppPool [Pool Name]在請求中被轉發,並且永遠不會傳遞正確的憑據。 是否在不使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;
        }
    }

沒有更多信息,很難確定,但是問題很可能是由於您正在嘗試進行雙跳身份驗證。

  1. 客戶端應用程序(對於網站是瀏覽器)對客戶端發送的用戶進行身份驗證
  2. 對服務器的身份驗證(MVC應用程序)
  3. 然后MVC應用程序嘗試將身份驗證傳遞給Web服務

當我需要執行類似的任務時,我無法使HttpClient運行。 我從此問題嘗試了許多建議的解決方案,即如何使HttpClient隨請求一起傳遞憑據? 盡管內容翔實-特別是BlackSpy的答案的這一部分解釋了原因:

您想要做的是讓NTLM將身份轉發到下一台服務器,這是做不到的-它只能進行模擬,而模擬只能使您訪問本地資源。

我最終在MVC應用程序中使用了類似以下內容的WebClient(具有必需的目標.NET框架)(在這種情況下,是從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 Core解決方案,但是自此以后,它似乎已被添加。

將WebClient添加到新的System.Net.WebClient合同

此PR將System.Net.WebClient移植到corefx。 該代碼大部分來自台式機,然后在樣式上進行了一些清理。 唯一的主要代碼重寫是刪除數百行基於APM回調的復雜代碼,並用一些核心異步方法替換它。 仍然可以進行更多清理工作,但是從功能上講,這已經足夠了。

沒有看到代碼很難說。 您是否嘗試過不設置Credentials參數? 我將運行提琴手,比較由MVC應用程序和Postman發送的請求。

您可以在此GitHub討論頁上找到如何模擬已通過身份驗證的(Windows)用戶: https : //github.com/aspnet/Home/issues/1805

ilanc有一個非常好的演示,其鏈接指向底部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM