Почему возникает исключение DirectoryServicesCOMEx при запросе Active Directory с компьютера, отличного от веб-сервера? - PullRequest
4 голосов
/ 14 октября 2011

Мое приложение ASP.NET WebForms, работающее на IIS 7.5, работает нормально, когда запрос поступает с веб-сервера, но выдает следующую ошибку, когда тот же пользователь домена запрашивает ту же страницу с любого другого компьютера в домене:

TYPE: System.DirectoryServices.AccountManagement.PrincipalOperationException

MSG: произошла ошибка операций.

в System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit () в System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit () в System.DirectoryServices.AccountManagement.PrincipalContext.Initialize () в System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx () в System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper (контекст PrincipalContext, тип PrincipalType, Nullable`1 identityType, String identityValue, DateTime refDate) в System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType (контекст PrincipalContext, тип PrincipalType, String identityValue) в System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity (контекст PrincipalContext, String identityValue) в Ceoimage.Basecamp.ActiveDirectory.SidSource._TryGetGroupPrincipal (контекст PrincipalContext, строка groupName) в c: \ Users \ David \ Documents \ VsProjects \ CeoTrunk \ Ceoimage.Basecamp \ Basecamp \ ActiveDirectory \ SidSource.cs: строка 115 *

- ВНУТРЕННЕЕ ИСКЛЮЧЕНИЕ -

TYPE: System.DirectoryServices.DirectoryServicesCOMException

MSG: произошла ошибка операций.

в System.DirectoryServices.DirectoryEntry.Bind (логический throwIfFail) в System.DirectoryServices.DirectoryEntry.Bind () в System.DirectoryServices.DirectoryEntry.get_SchemaEntry () в System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer (DirectoryEntry de) в System.DirectoryServices.AccountManagement.ADStoreCtx..ctor (DirectoryEntry ctxBase, логическое ownCtxBase, имя пользователя String, пароль String, параметры ContextOptions) в System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry (запись DirectoryEntry) в System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit ()

Файл приложения web.config указывает <authentication mode="Windows"> и <identity impersonate="true" />, но не использует поставщика членства. В IIS пул приложений запускается от имени пользователя домена, и для проверки подлинности приложения отключено все, кроме олицетворения ASP.NET (для пользователя, прошедшего проверку подлинности) и проверки подлинности Windows.

Код, который вызывает ошибку, просто пытается получить SID группы, чтобы убедиться, что пользователь должен получить доступ к приложению:

public string GetGroupSid()
{
    using (var context = new PrincipalContext("Domain", "Test", "CN=Users,DC=Test,DC=local", ContextOptions.Negotiate))
    {
        var group = _TryGetGroupPrincipal(context, "AppGroup");
        return group.Sid.Value;
    }
}
private static GroupPrincipal _TryGetGroupPrincipal(PrincipalContext context, string groupName)
{
    try
    {
        return GroupPrincipal.FindByIdentity(context, groupName);
    }
    catch (Exception e)
    {
        throw _GetUnableToFindGroupException(e, groupName);
    }
}

Как я уже говорил ранее, приложение работает нормально, если запрос приходит с веб-сервера, но выдает эту ошибку, когда тот же пользователь домена запрашивает ту же страницу с любого другого компьютера в домене. Я знаю о включении Kerberos , но вы можете видеть, что мой код указывает ContextOptions.Negotiate. Я не эксперт в этом деле, но я искусно сбит с толку.

1 Ответ

4 голосов
/ 14 октября 2011

Настройка веб-сервера для делегирования позволила моему веб-приложению запрашивать SID группы AD без ошибок и без изменения какого-либо кода.

...