1

У нас есть сайт 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?

+1

Попробуйте выполнить регистрацию типа «EngineContext.CurrentUser» на производственной машине. Он, скорее всего, НЕ содержит ваш пользовательский принцип. –

ответ

1

Я думал, что это был WindowsAuthenticationModule, который добавил WindowsPrincipal в HttpContext.User, но удаление, которое все еще дало ту же проблему. Это подразумевается в этой статье:

http://msdn.microsoft.com/en-us/library/ff647076.aspx

Я попытался установить AppDomain.CurrentDomain.SetPrincipalPolicy ( PrincipalPolicy.NoPrincipal);

на appstart и OnAuthenticateRequest как предложено, но безрезультатно.

Однако, это работало (в OnAuthenticateRequest):

Context.User = new GenericPrincipal(new GenericIdentity(String.Empty), new string[0]); 

Я осесть на это сейчас. Спасибо за каждый вклад!

+0

Global.asax OnAuthenticationRequest – onof