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, и тогда ответственность за удаление возвращенного объекта возлагается на вызывающих.