Исследование:
Похожие проблемы с обходным решением, но не фактическое решение существующей проблемы
Аналогичная проблема, указывающая на обновление Microsoft End Point как виновника
Вышеупомянутые ссылки наиболее подходят для моей проблемы, я также рассмотрел каждый аналогичный вопрос, указанный Stack Overflow, при создании этого сообщения, и только указанные выше вопросы соответствуют моей проблеме.
Фон:
Я использовал UserPrincipal.GetAuthorizationGroups
для разрешений для доступа к определенной странице с помощью IIS 7.5 на сервере Server 2008 R2 на веб-сайте С#.NET 4.0 в течение 2 с половиной лет. 15 мая 2013 года мы удалили основной контроллер домена, работающий под управлением Server 2008 (а не r2), и заменили его контроллером домена Server 2012. На следующий день мы начали получать исключение, указанное ниже.
Я использую основной контекст для проверки подлинности форм. Рукопожатие username/pass завершается успешно, и файл cookie auth установлен правильно, но последующий вызов основного контекста, который также вызывает UserPrincipal.GetAuthorizationGroups
, прерывается с перерывами. Мы решили несколько проблем BPA, появившихся в контроллере домена Server 2012, но это еще не решило проблему. Я также создал cron, который работает на двух отдельных серверах. Два сервера будут сбой в решении группы SID в разное время, хотя они работают с одинаковой базой кода. (Среда разработки и производственная среда).
Проблема временно разрешается при перезагрузке веб-сервера, а также на dev-сервере она решится после 12 часов работы. Рабочий сервер обычно перестает нормально функционировать до перезагрузки без разрешения.
В этот момент я пытаюсь уточнить специфические контроллеры домена cron для сети в сети, а также новый DC и использовать стандартный запрос LDAP, который в настоящее время не дает больше целевых исключений. До сих пор мы обнаружили на одном веб-сервере, что в дни, когда он терпит неудачу, нет шаблона, но он восстановится примерно через 12 часов. Последние результаты показывают сбой разрешения SID группы между 8 AM-8PM, после чего он восстанавливается, через несколько дней он будет терпеть неудачу в 8 вечера и восстанавливаться с 8 утра, а затем работать нормально еще на 12 часов и снова сбой. Мы надеемся выяснить, является ли это просто проблемой связи с сервером или чтобы убедиться, что это весь набор контроллеров домена.
Исключение:
Exception information:
Exception type: PrincipalOperationException
Exception message: An error (1301) occurred while enumerating the groups.
The group 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) и внедрение нового сервера 2012 DC приведет к сбою UserPrincipal.GetAuthorizationGroups
с ошибкой разрешения SID 1301?
Также были бы оценены идеи по устранению возможных причин.
Отказ от ответственности:
Это мой первый пост для, я часто занимаюсь здесь, но до сих пор не участвовал в обсуждениях. Простите меня, если я должен был разместить в другом месте и не стесняйтесь указывать лучшие шаги перед публикацией.
ОБНОВЛЕНИЕ 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<Principal> 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<Principal> 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;
}