System.DirectoryServices.AccountManagement.UserPrincipal - локальный хост, но не iis

Почему код ниже работает нормально, когда я запускаю свое веб-приложение localhost, а не когда я устанавливаю его на сервер IIS?

using (HostingEnvironment.Impersonate())
{
    UserPrincipal activeUser = UserPrincipal.Current;
    String activeUserSid = activeUser.Sid.ToString();
    String activeUserUPN = activeUser.UserPrincipalName;
}

Пожалуйста, не предлагайте мне придерживаться HttpContext.Current.User поскольку он не обеспечивает доступ к SID или UPN без дополнительных вызовов Active Directory.

Веб-приложение будет использоваться аутентифицированными пользователями Windows из трех отдельных доменов, веб-сервер размещен в четвертом домене. Пул приложений настроен для работы под NetworkService Для идентичности и конфигурации веб-приложения олицетворение идентичности установлено в значение true.

Сообщение об ошибке, когда он работает на IIS:

Ошибка в Page_Load (): UserPrincipal.Current.
System.InvalidCastException: невозможно привести объект типа 'System.DirectoryServices.AccountManagement.GroupPrincipal' к типу 'System.DirectoryServices.AccountManagement.UserPrincipal'.
в System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(контекст PrincipalContext, IdentityType identityType, String identityValue)
в System.DirectoryServices.AccountManagement.UserPrincipal.get_Current()
в webapp.Details.Default.Page_Load(Отправитель объекта, EventArgs e)

РЕДАКТИРОВАТЬ: Попробовал оба следующих и, к сожалению, получить ту же ошибку.

UserPrincipal userPrincipal = UserPrincipal.Current;
Response.Write(userPrincipal.Name);
Principal userOrGroup = UserPrincipal.Current;
Response.Write(userOrGroup.Name);

2 ответа

Решение

Похоже, нужен какой-то другой метод для определения пользователя.
Вот описание от MSDN для свойства:
Msgstr "Получает объект субъекта пользователя, который представляет текущего пользователя, под которым работает поток."
Итак, UserPrincipal.Current возвращает пользователя, под которым работает IIS.

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.userprincipal.aspx

У меня было много проблем с развертыванием UserPrincipal.Current, и я до сих пор не до конца понимаю, почему.

В конце концов я в конечном итоге использовал PrincipalSearcher и создал следующую функцию, чтобы делать то, что, по моему мнению, делал UserPrincipal.Current.

private UserPrincipal GetActiveDirectoryUser(string userName)
{
    using(var ctx = new PrincipalContext(ContextType.Domain))
    using(var user = new UserPrincipal(ctx) { SamAccountName = userName})
    using(var searcher = new PrincipalSearcher(user))
    {
        return searcher.FindOne() as UserPrincipal;
    }
}

И я передал System.Web.HttpContext.Current.User.Identity.Name в этот метод как userName.

Да, это потому, что вы избавляетесь от возвращенного объекта UserPrincipal из-за многократного использования операторов. Удалите 'ctx' из оператора using, и тогда ответственность за удаление возвращенного объекта возлагается на вызывающих.

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