2013-02-11 59 views
0

我有一個MVC 3站點,其中一些控制器/操作需要Windows身份驗證,其他不需要,即匿名。IIS 7.5 Windows +匿名身份驗證間歇性地工作

該網站運行良好一段時間,我可以訪問匿名操作和經過身份驗證的操作(無需提示,憑證會在Chrome/IE/FireFox中自動傳遞),但隨後身份驗證停止工作,我開始收到提示永遠不會被接受的憑證。

我必須重新啓動整個服務器,或將站點物理路徑更改爲另一個應用程序,並在返回到原始站點時進行已驗證的請求,該請求可以正常工作。然後沖洗並重復這種情況,但我找不到任何模式。如果我什麼都不做,身份驗證就會中斷。

我有IIS 7.5的配置如下:

應用程序池

  • .NET Framework版本 - V4.0
  • 託管管道模式 - 集成
  • 應用程序池標識 - ApplicationPoolIdentity

Site

  • 匿名身份驗證 - 啓用
  • 匿名用戶身份 - IUSR [我相信這是默認]
  • ASP.NET模擬 - 禁用
  • 窗體身份驗證 - 禁用
  • Windows身份驗證 - 啓用
  • Windows身份驗證擴展保護 - 關
  • Windows身份驗證啓用內核模式身份驗證 - 在
  • Windows身份驗證提供者 - 協商,NTLM

控制器

// Anonymous Controller 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return this.View(); 
     } 
    } 

// Authenticated Controller 
    [Authorize] 
    public class AnotherController : Controller 
    { 
     public ActionResult Index() 
     { 
      var viewModel = // create view model; 
      return this.View(viewModel); 
     } 
    } 

在任何時候,驗證工作或沒有一個GET到/ home /索引完全按預期返回200。 當認證工作GET請求/其它/指數看起來是這樣的:

> GET /another/index 
    Response: 401 
    Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate 


> GET /another/index 
    Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw== 
    Response: 401 
    Response Header: WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA== 

> GET /another/index 
    Request Headers: Authorization: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA== 
    Response: 200 

當認證打破了GET請求/其它/指數看起來是這樣的:

> GET /another/index 
    Response: 401 
    Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate 


> GET /another/index 
    Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw== 
    Response: 401 
    Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate 

在這一點上我我提示輸入憑據,這是我進入,同樣的請求,響應重新發送:

> GET /another/index 
     Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw== 
     Response: 401 
     Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate 

有誰知道,如果我有一些配置錯誤(我確信我不或者我不會指望它能夠工作),爲什麼認證中斷或者我可以如何阻止它?

非常感謝所有。

回答

0

因此,原來,這是因爲在web.config

<httpErrors errorMode="Custom"> 
     <remove statusCode="401" subStatusCode="-1"/> 
     <error statusCode="401" path="/Unauthorized" responseMode="ExecuteURL"/> 
     <remove statusCode="403" subStatusCode="-1"/> 
     <error statusCode="403" path="/Unauthorized" responseMode="ExecuteURL"/> 
     <remove statusCode="404" subStatusCode="-1"/> 
     <error statusCode="404" path="/NotFound" responseMode="ExecuteURL"/> 
     <remove statusCode="500" subStatusCode="-1"/> 
     <error statusCode="500" path="/ServerError" responseMode="ExecuteURL"/> 
    </httpErrors> 

的httpErrors部分的使用不好的結果,這導致在NTLM要求重新提交不從服務器發送時的憑據認證是必需的。即應發生什麼請求,挑戰(請用憑證重新提交)回覆。究竟發生了什麼請求,響應。挑戰從未被髮送。

正確的做法是完全刪除此部分,並在我的錯誤控制器操作使用擴展方法TrySkipIisCustomErrors

相關問題