Мое приложение 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
. Я не эксперт в этом деле, но я искусно сбит с толку.