2015-02-18 3 views
0

Когда пользователь проходит проверку подлинности Windows, в моем WebAPI приложении, и я использую UserPrincipal.Current, я получаю ошибку, чтоПолучить пользователь DirectoryEntry после проверки подлинности Windows

System.DirectoryServices.AccountManagement.GroupPrincipal не может быть преобразован в System.DirectoryServices .AccountManagement.UserPrincipal

at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) 
at System.DirectoryServices.AccountManagement.UserPrincipal.get_Current() 

Я not the only one to have this problem.

Но у меня есть ApiController.User объект заполнен правильно. Так что я пробовал:

Principal principal = (Principal)User; 
principal.GetUnderlyingObject(... 

Но он не будет делать, потому что

IPrincipal не могут быть преобразованы в Principal

Итак, я должен преобразовать в основной Windows, который работает :

WindowsPrincipal winPrincipal = (WindowsPrincipal)User; 

И затем я должен спросить AD для этого конкретного пользователя:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
{ 
    Principal principal = Principal.FindByIdentity(pc, windowsPrincipal.Identity.Name); 
    principal.GetUnderlyingObject(... 
} 

В 9 из 10 случаев это работает, но для некоторых пользователей принципал имеет значение null, хотя пользователь аутентифицирован. Пострадавшие пользователи являются частью определенного субдомена. Что я вижу? Есть ли еще один, более надежный способ всегда получать основную часть AD для аутентифицированной ОС Windows?

ответ

1

Вы должны держать IPrincipalIIdentity) интерфейсы, которые являются основными интерфейсами безопасности .NET, отделенные от UserPrincipal в AD - это те НЕ то же самое и не связаны напрямую.

В AD, вы всегда можете использовать

UserPrincipal current = UserPrincipal.Current; 

, чтобы получить информацию AD текущего пользователя

+0

Использование UserPrincipal.Current бросает ошибку, что «System.DirectoryServices.AccountManagement.GroupPrincipal» не может быть преобразован в " System.DirectoryServices.AccountManagement.UserPrincipal "(' at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity (контекст PrincipalContext, IdentityType identityType, String identityValue), в System.DirectoryServices.AccountManagement.UserPrincipal.get_Current() '). Я просто добавил это к исходному сообщению. – Alexander

+0

@Alexander: в этом случае ваше веб-приложение может работать под пулом приложений, в котором используется группа Windows ** ** - в этом случае вам нужно отдать его на «GroupPrincipal» вместо –

+0

Мне не нужно приложение пул, мне нужен пользователь, который вошел в систему. И «бросок», который терпит неудачу, выполняется внутри 'UserPrincipal.get_Current()', который является встроенным Microsoft, поэтому я не могу изменить это действие, я могу только воздержаться от использования 'UserPrincipal.Current'. – Alexander

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