User.IsInRole("поддельная группа") приводит к "Не удалось установить доверительные отношения между основным доменом и доверенным доменом"
У меня есть приложение MVC 3, использующее проверку подлинности Windows с утверждениями с использованием WIF 4.5.
Доступ к приложению контролируется (в настоящее время) через членство в группе AD:
<deny users="?" />
<allow roles="domain\somegroup" />
<deny users="*" />
В дополнение к группам AD у нас есть собственные роли, которые необходимо добавить. (Это приложение конвертируется из форм в аутентификацию Windows)
Для поддержки этих пользовательских ролей (до тех пор, пока они не будут управляться в AD), мы добавляем их как ClaimTypes.GroupSid к пользователю, чтобы существующий код использовал [Authorize("ADMIN")]
а также User.IsInRole("ADMIN")
продолжает функционировать:
Application_PostAuthenticateRequest(object sender, EventArgs e)
{
var identity = ClaimsPrincipal.Current.Identity as WindowsIdentity;
var roles = userDAL.GetRoles(identity.Name);
foreach(var role in roles)
{
identity.AddClaim(new Claim(ClaimTypes.GroupSid, role));
}
}
И все это работает, как ожидалось.
За исключением случаев, когда текущий пользователь НЕ является членом какой-либо настраиваемой роли (например, ADMIN), и эта роль также не существует в AD
Мы используем [Authorize("ADMIN")]
на методы действия контроллера, а также различные случаи User.IsInRole("ADMIN")
в зависимости от сценария. Это в тех случаях, когда происходит ошибка, и приложение взрывается.
Инфраструктура AD находится в процессе обновления / миграции. Я не осведомлен обо всех деталях, но знаю, что есть несколько доменов, предположительно с доверием между ними, и мне сказали специалисты по инфраструктуре, что эти доверительные отношения установлены и работают.
Так что на самом деле, я думаю, мне интересно 2 вещи:
Это действительно не похоже на то, что наш код должен обрабатывать. Так что действительно может быть не так с доменом? Могу ли я узнать, для какого "доверенного" домена нарушаются доверительные отношения?
Каков наилучший способ обойти это? Мне не нравится идея написания вспомогательных методов и
Authorize()
подклассы просто чтобы заманить это исключение в ловушку
1 ответ
Перейдите на страницу inetmgr, сайты, веб-сайт по умолчанию, имя сайта, группу iis, двойной щелчок по аутентификации, отключение анонимной аутентификации, а затем сбросьте пул приложений.
Это происходит, когда Windows не может расшифровать роли, определенные в теге "авторизация, разрешить роли" в файле web.config. Для тестирования закомментируйте теги пользовательских ролей из файла web.config. Эта проблема возникает при смешивании проверки подлинности с помощью форм и проверки подлинности Windows. Волшебство происходит в методе Application_PostAuthenticateRequest файла Global.asax, при использовании проверки подлинности с помощью форм вы можете преобразовать User.Identity в FormsIdentity, затем создать пользовательский идентификатор из билета FormsIdentity, а затем создать собственный принцип из пользовательского идентификатора, после чего вы будете возможность прикрепить CustomPrincipal к текущему пользователю и текущему принципалу, т.е.
Dim fIdent As FormsIdentity = CType(User.Identity, FormsIdentity)
Dim ci As New CustomIdentity(fIdent.Ticket)
Dim cp As New CustomPrincipal(ci)
HttpContext.Current.User = cp : Thread.CurrentPrincipal = cp
Для IIS вы хотите включить проверку подлинности с помощью форм и анонимную проверку подлинности, все остальное должно быть отключено. При использовании проверки подлинности Windows метод Application_PostAuthenticateRequest в файле Global.asax может создать пользовательский принцип непосредственно из User.Identity, т.е.
Dim cp As New CustomPrincipal(User.Identity)
HttpContext.Current.User = cp : Thread.CurrentPrincipal = cp
В этом случае в качестве параметров IIS должна использоваться проверка подлинности Windows, а олицетворение ASP.Net включено, а все остальное отключено.
Смешивание этих методов проверки подлинности приводит к ошибке "Отношения доверия между основным доменом и доверенным доменом не удалось", потому что если ваш метод Application_PostAuthenticateRequest по какой-то причине не реализует CustomPrinciple, то окна будут пытаться использовать встроенную функцию IsInRole, которая проверяет роль против ролей домена вместо использования пользовательского IsInRole, который находится в вашем коде кода CustomPrinciple за файлом.
Вот полезная статья и ссылки:
http://www.codeproject.com/Articles/8819/Authorize-and-authenticate-users-with-AD https://msdn.microsoft.com/en-us/library/ff647405.aspx
https://support.microsoft.com/en-us/kb/306359
Это происходит, если у вас есть недоступная конфигурация доверенного домена, IsInRole также выполняет поиск группы в доверенных доаминах, а если доверенный домен недоступен, выдает исключение доверия.