2013-02-11 5 views
0

У меня есть сайт MVC 3, в котором некоторые контроллеры/действие требуют проверки подлинности Windows, другие - нет, то есть анонимны.IIS 7.5 Windows + Анонимная проверка подлинности работает с перерывами

Сайт работает нормально какое-то время, я могу получить доступ как к анонимным действиям, так и к аутентифицированным (без запроса, учетные данные передаются автоматически в Chrome/IE/FireFox), но тогда аутентификация просто перестает работать, я начинаю запрашивать учетные данные, которые никогда не принимаются.

Я должен либо перезагрузить весь сервер, либо изменить физический путь сайта к другому приложению, сделать аутентифицированный запрос, который работает, когда он возвращается на исходный сайт. Ситуация затем промывается и повторяется, но я не могу найти никакого шаблона. Если я ничего не сделаю, аутентификация останется сломанной.

У меня есть IIS 7.5 настроен следующим образом:

App Pool

  • .NET Framework версий - v4.0
  • Управляемый Трубопроводный режим - Встроенный
  • Удостоверение пула приложений - ApplicationPoolIdentity

Сайт

  • Anonymous Authentication - Enabled
  • Анонимный идентификатор пользователя - IUSR [Я считаю, что это по умолчанию]
  • ASP.NET Олицетворение - Отключено
  • формы аутентификации - Отключено
  • проверки подлинности Windows - Enabled
  • Расширенная проверка подлинности 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 в/дом/индекса возвращает 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 

В этой точке I я запрошены учетные данные, которые я ввожу, тот же запрос, ответ негодуют:

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

кто-нибудь знает, если я что-то неправильно настроена (я довольно уверен, что я не» t или я бы не ожидал, что он вообще будет работать), почему аутентификация ломается или как я могу ее остановить?

Большое спасибо.

ответ

0

Так получается, что это в результате плохого использования раздела httpErrors в 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> 

Это привело к требованию NTLM, чтобы заново учетные данные не отправляются с сервера при требуется аутентификация. То, что должно произойти Запрос, вызов (повторите отправку с учетными данными) Ответ. На самом деле произошло запрос, ответ. Задача никогда не отправлялась.

Правильный подход заключается в том, чтобы полностью удалить этот раздел и в моих действиях контроллера ошибок использовать метод расширения TrySkipIisCustomErrors.

Смежные вопросы