查找用户如何跨域工作 c#

Find user how to method work cross domain c#

UserPrincipal.FindByIdentity(…) 方法不能跨域。 SingleSignOn 应用程序池 运行 域外的用户未自动登录。当尝试以这些用户之一的身份访问 SingleSignOn 页面时,出现 NullReferenceException 错误


如果您想要一种方法来检查各个域中的用户,则必须遍历各个域(具有访问权限的用户可以读取每个域)。

如果您有可用的用户域信息,您可以将域作为参数添加到您的方法中。

我不确定 AuthUserSession 是否有任何 属性 可能也包含用户的域。如果是,请使用它而不是传递给该方法的域名参数。

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.
}

更新

如果您在 session.id 中有域名,请使用以下内容,

string lookup = userSession.Id;
  using (var pc = new PrincipalContext(ContextType.Domain, lookup.Split('\')[0]))
  {
  ...