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

时间:2009-02-22 15:00:27

标签: c# asp.net active-directory

有没有办法使用来自用户保存的密码列表的凭据并使用该凭据而不是本地Windows凭据?

我需要根据用户的Active Directory用户名查找用户的电子邮件地址,以允许他们通过Intranet站点注册电子邮件更新。如果用户实际上直接登录到域的一部分,这似乎很容易 - 我可以使用他们的身份名称根据用户名搜索AD:

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

但是,如果在家中使用PC,则无效。 Page.Identity.Name解析为我登录到自己的PC(MyMachine\Dave)的名称,忽略了我用于对我的工作域(WorkDomain\dave.downs)进行身份验证的存储凭据。

DirectoryEntry选择并使用保存的凭据就好了,允许我实际绑定并搜索AD,但我找不到一种方法然后将其用作var username,它将包含我的本地计算机用户名。

有没有办法真正做我想做的事情,或者我只是走错路/撞到砖墙上?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

将为您提供登录用户的sid。

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