ASP.NET MVC: как IPrincipal может быть нулевым?

Я использую веб-сайт на IIS6 / Server 2003, который использует встроенную проверку подлинности Windows в локальной интрасети. Я могу перейти на сайт, но периодически получаю ошибки "Object null" при вызове следующего кода C#, который вызывается при каждом запросе:

.... 
GetUserIdFromPrincipal(User) 
....  

public static string GetUserIdFromPrincipal(IPrincipal principal) {     
     return principal.Identity is WindowsIdentity ? (principal.Identity as WindowsIdentity).User.Value : principal.Identity.Name; 
} 

Так как ошибка явно прерывистая, Windows Auth работает на каком-то уровне, но после навигации по сайту за несколько кликов я получаю пустую ссылку, означающую, что IPrincipal равен нулю (я думал, что в ASP.NET это никогда не должно быть нулевым).

Ошибка происходит только на недавно созданной виртуальной машине. Код хорош на других машинах и, конечно, при локальной разработке.

Запрашивает ли IIS сведения об аутентификации Windows для каждого запроса? Что может вызвать такую ​​неустойчивую проблему? Любая помощь или предложения будут высоко оценены.

2 ответа

Решение

Я думаю, что в приведенном выше случае это было потому, что мы проверили аутентификацию Windows и Anonymous в IIS6. Казалось, что это создает ситуацию, когда IIS иногда использует аутентификацию Windows и, следовательно, создает IPrincipal, но в других случаях используется анонимная аутентификация, которая не создает IPrinciple. Конечно, отключение опции Anonymous Auth, похоже, решило проблему.

Я бы предположил, что ваша личность просто не является WindowsIdentity, и, следовательно, случай потерпит неудачу и приведет к нулевому объекту. IIdenty может быть FormsIdentity, ClientFormsIdentity, GenericIdentity, PassportIdentity и WindowsIdentity, я думаю, вы должны попробовать


typeof(principal.Identity);

чтобы получить настоящий.

Другие вопросы по тегам