UserPrincipals.GetAuthorizationGroups Произошла ошибка (1301) при перечислении групп. После обновления до контроллера домена 2012 сервера
Исследование:
Аналогичная проблема с обходным решением, но не реальное решение существующей проблемы
Аналогичная проблема, указывающая на обновление Microsoft End Point как на виновника
Приведенные выше ссылки являются наиболее подходящими для моей проблемы. Я также просмотрел все похожие вопросы, перечисленные в Stack Overflow при создании этого сообщения, и только вышеуказанные вопросы соответствуют моей проблеме.
Фон:
Я используюUserPrincipal.GetAuthorizationGroups
для разрешений для доступа к определенной странице с IIS 7.5 на Server 2008 R2 на сайте веб-форм C # .NET 4.0 в течение 2 с половиной лет. 15 мая 2013 года мы удалили основной контроллер домена под управлением Server 2008 (не r2) и заменили его контроллером домена 2012 сервера. На следующий день мы начали получать исключение, указанное ниже.
Я использую основной контекст для проверки подлинности с помощью форм. Рукопожатие имени пользователя / пароля успешно выполнено, и файл cookie аутентификации установлен правильно, но последующий вызов основного контекста, который также вызываетUserPrincipal.GetAuthorizationGroups
терпит неудачу с перерывами. Мы'Мы решили несколько проблем BPA, которые появились в контроллере домена Server 2012, но это еще не помогло решить проблему. Я также учредил cron, который работает на двух отдельных серверах. Два сервера не смогут выполнить разрешение SID группы в разное время, хотя они работают с одной и той же кодовой базой. (Среда разработки и производственная среда).
Эта проблема временно разрешается после перезагрузки веб-сервера, а также на сервере dev она решается сама по себе после 12 часов простоя. Рабочий сервер обычно перестает функционировать должным образом до перезагрузки без разрешения самого себя.
На данный момент я пытаюсь уточнить cron, нацеленный на определенные контроллеры домена в сети, а также на новый DC и использующий стандартный запрос LDAP, который в настоящее время не дает более целевые времена исключений. Так далеко мыНа одном веб-сервере мы обнаружили, что в дни, когда он выходит из строя, отсутствует шаблон, но он восстановится примерно через 12 часов. Последние результаты показывают сбой разрешения SID группы между 8 и 8 часами вечера, затем он восстанавливается, через несколько дней он выходит из строя в 8 часов вечера, восстанавливается в 8 часов утра, затем работает нормально еще 12 часов и снова выходит из строя. Мы надеемся увидеть, является ли это просто конкретной проблемой связи с сервером, или посмотреть, является ли это полным набором контроллеров домена.
Исключение:
Exception information:
Exception type: PrincipalOperationException
Exception message: An error (1301) occurred while enumerating the groups.
The group's SID could not be resolved.
at System.DirectoryServices.AccountManagement.SidList.TranslateSids(String target, IntPtr[] pSids)
at System.DirectoryServices.AccountManagement.SidList..ctor(SID_AND_ATTR[] sidAndAttr)
at System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase)
at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p)
at System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups()
Вопрос:
Учитывая приведенную выше информацию, кто-нибудь имеет представление, почему вывод из эксплуатации Windows Server 2008 (не r2) и внедрение нового DC 2012 Server может привести кUserPrincipal.GetAuthorizationGroups
с ошибкой разрешения 1301 SID? Идеи по устранению возможных причин также приветствуются.
Отказ от ответственности:
Это мой первый пост в Stack Overflow, я часто исследую его, но до сих пор не участвовал в дискуссиях. Простите, если я должен был опубликовать в другом месте и не стесняйтесь указывать лучшие шаги перед публикацией.
ОБНОВЛЕНИЕ 13-ИЮНЯ-2013:
12 июня я рассмотрел возможность того, что предметы не были выброшены, что вызвало проблему. Сроки были слишком короткими, чтобы определить, исправил ли исправленный код проблему, но я буду продолжать обновлять ее по мере того, как мы будем работать над решением проблемы, так что, возможно, при любой удаче кто-то здесь сможет протянуть руку.
Оригинальный код
public bool isGroupMember(string userName, ArrayList groupList)
{
bool valid = false;
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain_server + ".domain.org:636", null, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
// find the user in the identity store
UserPrincipal user =
UserPrincipal.FindByIdentity(
ctx,
userName);
// get the groups for the user principal and
// store the results in a PrincipalSearchResult object
PrincipalSearchResult groups =
user.GetAuthorizationGroups();
// display the names of the groups to which the
// user belongs
foreach (Principal group in groups)
{
foreach (string groupName in groupList)
{
if (group.ToString() == groupName)
{
valid = true;
}
}
}
return valid;
}
Обновленный код
public bool isGroupMember(string userName, ArrayList groupList, string domain_server)
{
bool valid = false;
try
{
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain_server + ".domain.org:636", null, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer))
{
// find the user in the identity store
UserPrincipal user =
UserPrincipal.FindByIdentity(
ctx,
userName);
try
{
// get the groups for the user principal and
// store the results in a PrincipalSearchResult object
using (PrincipalSearchResult groups = user.GetAuthorizationGroups())
{
// display the names of the groups to which the
// user belongs
foreach (Principal group in groups)
{
foreach (string groupName in groupList)
{
if (group.ToString() == groupName)
{
valid = true;
}
}
group.Dispose();
}
}//end using-2
}
catch
{
log_gen("arbitrary info");
return false;
}
}//end using-1
}
catch
{
log_gen("arbitrary info");
return false;
}
return valid;
}