2009-02-22 72 views
1

有没有办法使用来自用户保存的密码列表的凭证,并使用该凭证代替本地Windows凭证?如何在远程拨入时搜索Active Directory?

我需要根据用户的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 
    } 
} 

但是,如果从一台PC在工作家这不起作用。 Page.Identity.Name解决了我登录到我自己的PC(MyMachine\Dave)的名称,忽略了我用于验证我的工作域(WorkDomain\dave.downs)的存储凭据。

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

有没有一种方法可以真正做我想做的事情,或者我只是以错误的方式去做事/撞着我的头撞砖墙?

+0

如何配置Web服务器认证,以及您如何拨入?我有点困惑,“Page.User.Identity.Name”可以是来自域外的完全不受信任的机器的Windows用户名 - 至少在使用Windows身份验证时。 – Tomalak 2009-02-22 15:19:37

+0

身份验证当前设置为Windows,并使用Cisco VPN客户端拨入。除了使用客户端拨号之外,如果我想在域中执行任何操作(例如浏览计算机),则还必须提供我的域用户名和密码,以便在我的托管密码列表中进行设置。 – 2009-02-22 20:34:51

回答

1

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

0

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

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

,这将给你的登录用户的SID。

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

相关问题