Как получить Windows аутентифицированный Guid пользователя из внутреннего веб-приложения ASP? - PullRequest
2 голосов
/ 28 марта 2012

Хорошо, так что это работало на моем тестовом сервере VS (естественно), но как только я публикуюсь в IIS, он ломается. Чтобы это работало, мне нужно иметь возможность получить идентификатор GUID (не SID, пожалуйста) пользователя, который в данный момент вошел в систему. Используя DirectoryServices, это была моя оригинальная реализация:

var guid = UserPrincipal.Current.Guid.ToString();

Это дает мне ошибку, которую я не могу привести из GroupPrincipal к UserPrincipal. Похоже, приложение пытается работать как какая-то аутентифицированная группа или что-то в этом роде. Я понимаю, что нормальным подходом было бы что-то вроде HttpContext.Current.User.Identity, но я не уверен, что делать с этим, поскольку у него нет свойства Guid, и когда я пытаюсь преобразовать его в SID и выполнить запрос LDAP Это исключение. Может ли кто-нибудь помочь мне с необходимыми шагами для достижения этой цели?

Спасибо

UPDATE: Хорошо, вот моя самая последняя попытка:

protected string GetUserGuid()
    {
        var pc = new PrincipalContext(ContextType.Domain);
        var windowsID = HttpContext.Current.User.Identity;
        var up = UserPrincipal.FindByIdentity(pc, windowsID.Name);
        return up.Guid.ToString();
    }

И исключение, которое я получаю:

[COMException (0x8007054b): указанный домен либо не существует или не удалось связаться. ]
System.DirectoryServices.DirectoryEntry.Bind (Boolean throwIfFail) +788 System.DirectoryServices.DirectoryEntry.Bind () + 44
System.DirectoryServices.DirectoryEntry.get_AdsObject () + 42
System.DirectoryServices.PropertyValueCollection.PopulateList () + 29
System.DirectoryServices.PropertyValueCollection..ctor (DirectoryEntry запись, String propertyName) + 63
System.DirectoryServices.PropertyCollection.get_Item (String propertyName) + 163
System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer () +436 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit () +51 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize () +141 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx () +42 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper (PrincipalContext контекст, тип PrincipalType, Nullable`1 identityType, String identityValue, DateTime refDate) + 29
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity (PrincipalContext context, String identityValue) +95 TicketsToMe.GetUserGuid () + 123
TicketsToMe.Page_Load (Отправитель объекта, EventArgs e) + 38
System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Object o, Объект t, EventArgs e) +25 System.Web.UI.Control.LoadRecursive () +71 System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 3048

1 Ответ

1 голос
/ 28 марта 2012

Если что-то работает локально, но не в IIS, это может быть разрешением. Вы проверили уровень доверия на вашем IIS? Локальный тестовый сервер VS работает с Полным доверием, но веб-сайт IIS (особенно 7) может быть установлен на Средний или ниже. Раньше это вызывало у меня проблемы с похожими результатами, т. Е. Что-то работает локально, но не в IIS.

Также стоит проверить разрешения для пользователя пула приложений.

...