代码之家  ›  专栏  ›  技术社区  ›  Dave D

远程拨入时如何搜索Active Directory?

  •  1
  • Dave D  · 技术社区  · 16 年前

    是否可以使用来自用户保存的密码列表的凭据,并使用该凭据而不是本地Windows凭据?

    我需要根据用户的Active Directory用户名查找其电子邮件地址,以允许他们通过Intranet站点注册电子邮件更新。如果用户直接登录到域中的一台计算机上,这就足够简单了-我可以使用他们的标识名根据他们的用户名搜索广告:

    using( DirectoryEntry root = new DirectoryEntry("LDAP://admachine.domain.local") )
    {
      using( DirectorySearcher searcher = new DirectorySearcher(root) )
      {
        // strip the domain from the username and find the user in AD
        var username = Regex.Replace(Page.User.Identity.Name, @".*\\", string.Empty);
        searcher.ReferralChasing = ReferralChasingOption.All;
        searcher.SearchScope = SearchScope.Subtree;
        searcher.Filter = string.Format("(&(objectCategory=user)(objectClass=person)(sAMAccountName={0}))", username);
        var foundUser = searcher.FindOne();
    
        // error checking occurs here...
        var email = foundUser.Properties["mail"][0].ToString();
    
        // TODO: stuff with the email address
      }
    }
    

    但是,如果在家里的电脑上工作,这不起作用。 Page.Identity.Name 解析为我登录到自己电脑上的名称( MyMachine\Dave ,忽略我用于工作域身份验证的存储凭据( WorkDomain\dave.downs )

    这个 DirectoryEntry 拿起并使用保存的凭证很好,允许我实际绑定和搜索广告,但我找不到一种方法,然后使用它作为 var username ,它将包含我的本地计算机用户名。

    有没有一种方法可以真正做到我想做的,或者我只是在做错事/撞到砖墙上?

    2 回复  |  直到 11 年前
        1
  •  1
  •   Tobias Hertkorn    16 年前

    我想你在使用IIS。禁用匿名访问并启用Windows身份验证。这样,任何不在域中的人都会得到一个弹出窗口,允许他们指定他们的域用户和密码。对于来自启用域的服务器的用户,没有任何更改。但是这样你就保证了身份将永远解析为一个有效的域用户。所以这应该可以解决您的“我看到的是一个非域用户”问题。检查 Windows Authentication Provider 详情。

        2
  •  0
  •   Brian Rudolph    16 年前

    如果通过Windows身份验证登录,则可以使用:

    System.Security.Principal.WindowsIdentity.GetCurrent().User
    

    这将为您提供登录用户的SID。

    禁用IIS中的匿名访问和集成安全,强制他们通过HTTPS下的基本身份验证登录。这将确保当前会话在经过身份验证的域用户下运行。