2014-10-29 35 views
1

因此,我一直在拖延我可以找到關於這個主題的每一篇文章,但仍然沒有弄清楚。希望你能幫助:Web API + CORS +基本NTLM:401與Firefox + Chrome

的Web API 2 CORS啓用:

config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 

的web.config:

<system.web> 
<compilation debug="true" targetFramework="4.5" /> 
<httpRuntime targetFramework="4.5" /> 
<authentication mode="Windows" /> 
</system.web> 

jQuery的

<script> 
$(document).ready(function() 
{ 
    $("button").click(function() 
    { 
     var endpoint = "http://localhost:82/api/test"; 
     var base64Credentials = window.btoa("domain\credentials:password"); 

     $.ajax({ 
      url: endpoint, 
      beforeSend: function(xhr) { 
       xhr.withCredentials = true; 
       xhr.setRequestHeader("Authorization", "Basic " + base64Credentials); 
      }, 
      success: function(result) { 
       alert(result); 
      } 
     }); 
    }); 
}); 
</script> 

IIS啓用了基本身份驗證。

基本身份驗證在IE中工作。 Firefox和Chrome受到預檢OPTIONS調用的約束。

使用Fiddler,我可以看到,如果我將IIS設置爲同時允許匿名和基本身份驗證,那麼OPTIONS調用將導致200,然後隨後的基本身份驗證GET和全部在世界上都是正確的。如果我關閉匿名,那麼我會在OPTIONS調用中獲得401。

問:

它是一個必要條件允許匿名和基本身份驗證都支持這種使用情況?

回答

1

我已經在我的一個項目中部分解決了這個問題。它始終在IE中工作,但在Chrome瀏覽器中,我仍然會對請求進行隨機401回覆,但是當我檢查響應時,web api正在發送JSON數據以便它通過OPTIONS。

Web API的IIS站點配置爲: - Windows驗證,禁用匿名; - 而在Windows身份驗證提供者(右邊選項),移動NTLM頂端

在你的web.config:

<httpProtocol> 
    <customHeaders> 
    <!-- Allows auth in CORS AJAX requests --> 
    <add name="Access-Control-Allow-Credentials" value="true" /> 
    <!-- May only ever be one value - a domain or "*". "*" is disallowed when Access-Control-Allow-Credentials is true --> 
    <add name="Access-Control-Allow-Origin" value="http://localhost:63415" /> 
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Headers, Access-Control-Request-Method" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, HEAD, OPTIONS" /> 
    </customHeaders> 
</httpProtocol> 

在Global.asax.cs中

protected void Application_BeginRequest() 
    { 
     // When Chrome sends the OPTIONS it breaks on windows auth, so this fixes it. 
     if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") 
     { 
      Response.StatusCode = (int)HttpStatusCode.OK; 
      Response.Flush(); 
     } 
    } 

所有這些都沒有使用CORS NuGet包。我嘗試過,但我仍然有OPTIONS問題。

編輯:關於這一點的更新,它現在似乎在Chrome中對我來說工作得非常好。