Когда пользователь проходит проверку подлинности 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?
Использование 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
@Alexander: в этом случае ваше веб-приложение может работать под пулом приложений, в котором используется группа Windows ** ** - в этом случае вам нужно отдать его на «GroupPrincipal» вместо –
Мне не нужно приложение пул, мне нужен пользователь, который вошел в систему. И «бросок», который терпит неудачу, выполняется внутри 'UserPrincipal.get_Current()', который является встроенным Microsoft, поэтому я не могу изменить это действие, я могу только воздержаться от использования 'UserPrincipal.Current'. – Alexander