Найти пользователя, как работает метод кросс-домена c# - PullRequest
1 голос
/ 11 февраля 2020

Метод UserPrincipal.FindByIdentity (…) не работает между доменами. пользователи вне домена, в котором запущен пул приложений SingleSignOn, так как не выполняют автоматический вход. При попытке получить доступ к странице SingleSignOn в качестве одного из этих пользователей, возникает ошибка NullReferenceException


1 Ответ

2 голосов
/ 11 февраля 2020

Если вы хотите иметь метод, который проверяет пользователя в разных доменах, вам придется l oop через разные домены (с пользователями, которые имеют доступ для чтения через каждый домен).

Если вы делаете Имея информацию о домене, доступную пользователю, вы можете добавить домен в качестве аргумента для вашего метода.

Я не уверен, есть ли у AuthUserSession какое-либо свойство, которое также может содержать домен пользователя. Если это так, используйте его вместо аргумента domainName, переданного методу.

public void LoadUserAuthInfo(AuthUserSession userSession, IAuthTokens tokens, Dictionary<string, string> authInfo, string domainName= someDefaultIfNoneProvided)
{
  if (userSession == null)
        return;
  string lookup = userSession.Id;
  List<string> domains = new List<string>() { "domain1", "domain2" };
  bool userFound = false;

  foreach (string domain in domains)  
  {
    using (var pc = new PrincipalContext(ContextType.Domain, domain))
    {
       var user = UserPrincipal.FindByIdentity(pc, userSession.UserAuthName);

       // ---> Add Check here to prevent NRE
       if (user != null) {
           SingleSignOnResponse ssoB = new SingleSignOnResponse();
           ssoB.Username = user.Sid.Translate(typeof(NTAccount)).ToString();
           ssoB.Timestamp = DateTime.Now;
           SSOCache.Instance.TryAdd(lookup, ssoB);
           userFound = true;
           break; // No longer need to continue checking other domains.
       }
       else 
       {
           // Handle case when user does not exist.
       } 
    }
  }
  // Check if userFound = false. If so, do something with that exception.
}

Update

Если у вас есть имя_домена в session.id, используйте следующее,

string lookup = userSession.Id;
  using (var pc = new PrincipalContext(ContextType.Domain, lookup.Split('\\')[0]))
  {
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...