ASP.NET MVC: как IPrincipal может быть нулевым? - PullRequest
3 голосов
/ 17 января 2011

Я использую веб-сайт на 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 ]

2 голосов
/ 17 января 2011

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

2 голосов
/ 17 января 2011

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


typeof(principal.Identity);

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

...