У нас есть сайт ASP.NET, который частично зависит от проверки подлинности форм для учетных данных для входа, однако реализация IPrincipal полностью настраивается.Пользовательская реализация IPrincipal throws System.SystemException: отношения доверия
Но, при работе сайта на определенном сервере (который несколько полу-закаленное, когда речь идет о безопасности), происходит сбой приложения при вызове IPrincipal.IsInRole() со следующим messsage:
System.SystemException : Не удалось установить доверительные отношения между основным доменом и доверенным доменом.
Это указывает на ошибку связи между веб-сервером и DC, однако, поскольку наше приложение вообще не использует проверку подлинности Windows, я не понимаю, зачем ему нужно связываться с DC.
Это моя реализация:
[Serializable]
public class CustomPrincipal : IPrincipal
{
public CustomPrincipal(IUser userObj)
{
this.Identity = new CustomIdentity(userObj.Id, userObj.Username);
}
public bool IsInRole(string role)
{
if (role == null)
return false;
var roles = HttpContext.Current.Session["authentication-roles"] as string[];
if (roles == null)
return false;
return Array.IndexOf(roles, role) >= 0;
}
public IIdentity Identity { get; private set; }
public CustomIdentity FullIdentity
{
get { return (CustomIdentity) this.Identity; }
}
}
При отладке локально (где она работает) это правильное применение, что на самом деле работать. Использование заключается в следующем:
public override void Render()
{
var items = this.manager.Items
.Where(i => EngineContext.CurrentUser.IsInRole(i.Role.InternalName));
Установка точки останова здесь дает мне, что EngineContext.CurrentUser на самом деле реализация CustomPrincipal.
Кто-нибудь испытал это? Как возможно, что ASP.NET по-прежнему запускает любые LDAP-запросы по методу интерфейса?
Я нашел это, http://support.microsoft.com/kb/976494, но в моей среде как веб-сервер, так и DC - 2008 R2, поэтому это не должно применяться. Однако у меня есть некоторые ошибки в моем журнале событий, которые указывают на наличие некоторых проблем связи с DC, но поскольку мы не полагаемся на LDAP, это не должно быть проблемой.
Система безопасности не смогла установить защищенное соединение с сервером ldap/ddc.domain.com/xxxxxxxxxxxxx. Протокол аутентификации не доступен.
Серверы из моего объема, что означает, что я не могу исправить это сам, у меня есть билет поддержки, но он может быть намерен иметь эту настройку по соображениям безопасности (хотя это кажется немым) ,
Кто-нибудь испытал эту проблему?
Followup: трассировка стека показывает, что это:
at System.Security.Principal.NTAccount.TranslateToSids(IdentityReferenceCollection sourceAccounts, Boolean& someFailed)
at System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean forceSuccess)
at System.Security.Principal.WindowsPrincipal.IsInRole(String role)
at Company.Sites.Manager.ViewComponents.MenuComponent.<Render>b__0(INavigationItem i)
EDIT:
я, наконец, позволить воспроизвести эту ошибку на моем Dev-машине (я отозвана свою машину от вчерашнего DC, но Бесполезный 't воспроизводить его до сегодняшнего дня)
HttpContext.User на самом деле является WindowsPrincipal по умолчанию, и ошибка в моем коде заключалась в том, что я только заменил его CustomPrincipal при входе в систему. Следовательно, пользователи, не прошедшие проверку подлинности, все еще получают WindowsPrincipal, которые затем терпят неудачу, если у вас есть проблемы с доверием в вашем AD.
Я попытался изменить принципала по умолчанию, вызывая это на AppStart
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.NoPrincipal);
Но это, кажется, не пинать. Как я могу изменить принципала по умолчанию в ASP.NET?
Попробуйте выполнить регистрацию типа «EngineContext.CurrentUser» на производственной машине. Он, скорее всего, НЕ содержит ваш пользовательский принцип. –