C# 是否针对active directory中的用户进行身份验证?

C# 是否针对active directory中的用户进行身份验证?,c#,asp.net,active-directory,C#,Asp.net,Active Directory,我有一个web应用程序,其中有一个登录页。如何对active directory用户进行身份验证 到目前为止,我能够从active directory中获得一些属性,这表明我能够使用LDAP字符串与AD通信。我知道不可能从AD中提取密码并根据用户输入的密码进行身份验证 是否有一种方法可以针对active directory用户进行身份验证 这是到目前为止我的代码 public class Userdetails { public static string ADPath = C

我有一个web应用程序,其中有一个登录页。如何对active directory用户进行身份验证

到目前为止,我能够从active directory中获得一些属性,这表明我能够使用LDAP字符串与AD通信。我知道不可能从AD中提取密码并根据用户输入的密码进行身份验证

是否有一种方法可以针对active directory用户进行身份验证

这是到目前为止我的代码

     public class Userdetails
{
    public static string ADPath = ConfigurationManager.AppSettings.Get(“ADPath”); // Get the ADAM Path from web config fiel
    public static string ADUser = ConfigurationManager.AppSettings.Get(“ADUser”); //ADAM Administrator
    public static string ADPassword = ConfigurationManager.AppSettings.Get(“ADPassword”); //ADAM Administrator  password

public static DirectoryEntry GetUserDetails(string userID)
{
        AuthenticationTypes AuthTypes;  // Authentication flags.
        // Set authentication flags.
        // For non-secure connection, use LDAP port and
        //  ADS_USE_SIGNING |
        //  ADS_USE_SEALING |
        //  ADS_SECURE_AUTHENTICATION
        // For secure connection, use SSL port and
        //  ADS_USE_SSL | ADS_SECURE_AUTHENTICATION
        AuthTypes = AuthenticationTypes.Signing |
            AuthenticationTypes.Sealing |
            AuthenticationTypes.Secure;
        DirectoryEntry De = new DirectoryEntry(ADPath, ADUser, ADPassword, AuthTypes);
    DirectorySearcher Ds = new DirectorySearcher(De);
    SearchResult Sr;
    Ds.SearchScope = SearchScope.Subtree;
    Ds.Filter = “(&(objectclass=*)(cn= ” + userID + “))”;
    Sr = Ds.FindOne();
    if (!(Sr == null))
    {
        De = new DirectoryEntry(Sr.Path, ADUser, ADPassword, AuthTypes);
        return De;
    }
    else
    {
        return null;
    }
}


使用密码创建新的DirectoryEntry并与DirectorySearcher一起使用将验证密码,如果密码失败,将引发异常。一个重要的例外是空/空密码。如果password参数为null或空,大多数LDAP服务器(我认为包括AD)都会忽略它。所以你应该先测试一下


如果您只想针对广告进行身份验证,而不必执行其他特定于广告的操作,为什么不使用内置的
ActiveDirectoryMembershipProvider
而不是编写自定义代码

请看一看:


Active Directory服务器将能够接收用户名和密码,并告诉您密码是否正确,而无需启用可逆密码。所以这应该是可能的。你使用的是什么版本的C#?那么最后只能使用DirectoryEntry/DirectorySearcher。使用Wiktor或Brian代码中的基于配置的选项。两者都更易于使用。可能重复或相关-您在哪里可以找到
Configuration.Config.ActiveDirectory.PrimaryServer
Configuration.Config.ActiveDirectory.Container
?抱歉,这些是我的代码中的设置,我忘了提取。它们是表示服务器和容器名称的常量/变量,示例中有演示值
    public bool Validate(string username, string password)
    {

        //ex PrincipalContext principalContext = new PrincipalContext(ContextType.ApplicationDirectory,"sea-dc-02.fabrikam.com:50001","ou=ADAM Users,o=microsoft,c=us",ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind,"CN=administrator,OU=ADAM Users,O=Microsoft,C=US","P@55w0rd0987");

        try
        {
            using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, Configuration.Config.ActiveDirectory.PrimaryServer, Configuration.Config.ActiveDirectory.Container, ContextOptions.Negotiate))
            {
                return principalContext.ValidateCredentials(username, password);
            }
        }
        catch (PrincipalServerDownException)
        {
            Debug.WriteLine("PrimaryServer={0};Container={1}", Configuration.Config.ActiveDirectory.PrimaryServer, Configuration.Config.ActiveDirectory.Container);
            Debug.WriteLine("LDAP://{0}/{1}", Configuration.Config.ActiveDirectory.PrimaryServer, Configuration.Config.ActiveDirectory.Container);
            throw;
        }