Active directory 使用支持Active Directory的成员资格提供程序和您自己的定制提供程序进行安全保护

Active directory 使用支持Active Directory的成员资格提供程序和您自己的定制提供程序进行安全保护,active-directory,membership-provider,Active Directory,Membership Provider,我有一项任务是处理我的.Net web应用程序的安全性,其工作方式是,如果用户登录到Active Directory,并且用户的广告名在数据库中,那么他们将被允许进入 同样,如果用户的广告名不在数据库中,则会要求他们使用数据库中保存的用户名和密码登录 因此,我需要使用成员身份和角色提供程序进行某种混合模式安全登录 我遇到的问题是,您在哪里检测到用户是否可以使用AD登录,从而自动登录。听起来您需要实现从ActiveDirectoryMembershipProvider继承的自定义Membershi

我有一项任务是处理我的.Net web应用程序的安全性,其工作方式是,如果用户登录到Active Directory,并且用户的广告名在数据库中,那么他们将被允许进入

同样,如果用户的广告名不在数据库中,则会要求他们使用数据库中保存的用户名和密码登录

因此,我需要使用成员身份和角色提供程序进行某种混合模式安全登录


我遇到的问题是,您在哪里检测到用户是否可以使用AD登录,从而自动登录。

听起来您需要实现从ActiveDirectoryMembershipProvider继承的自定义MembershipProvider

至少,您需要重写
ValidateUser
,以便在
base.ValidateUser
返回false时,您可以尝试验证SQL数据库中的用户。下面的代码示例适用于我的测试应用程序,但是我没有实现SQL方法。这对你来说应该很直接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using System.Configuration;
using System.Configuration.Provider;

namespace Research.Web.Security
{
    public class MixedMembershipProvider : ActiveDirectoryMembershipProvider
    {
        protected String SqlConnectionString { get; private set; }

        private String GetConnectionString(String connectionStringName)
        {
            if (string.IsNullOrEmpty(connectionStringName))
                throw new ProviderException("ConnectionStringName must be specified.");

            ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[connectionStringName];
            if (settings == null)
            {
                throw new ProviderException(String.Format("Connection string {0} not found.", connectionStringName));
            }
            return settings.ConnectionString;
        }

        public override void Initialize(String name, System.Collections.Specialized.NameValueCollection config)
        {
            this.SqlConnectionString = GetConnectionString(config["sqlConnectionStringName"]);
            config.Remove("sqlConnectionStringName");

            base.Initialize(name, config);
        }

        public override Boolean ValidateUser(String username, String password)
        {
            if (!base.ValidateUser(username, password)) // validate using AD first
            {
                return ValidateUserSql(username, password); // if not in AD, check SQL
            }
            else
            {
                return true;
            }
        }

        private Boolean ValidateUserSql(String username, String password)
        {
            // look up your account in SQL here
            return true;
        }
    }
}
您的web配置如下所示:

<configuration>
  <!-- usual config stuff omitted -->
  <connectionStrings>
    <add name="SqlDefault" connectionString="Server=localhost;database=mydatabase;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
    <add name="ActiveDirectoryDefault" connectionString="LDAP://mydomain.com/DC=mydomain,DC=com" />
  </connectionStrings>

   <system.web>
 <!-- usual config stuff omitted -->
   <membership defaultProvider="Mixed">
      <providers>
        <clear/>
        <add name="Mixed"
             type="Research.Web.Security.MixedMembershipProvider, Research.Web"
             applicationName="/"
             connectionStringName="ActiveDirectoryDefault"
             sqlConnectionStringName="SqlDefault"
             connectionUsername="mydomain\myadmin" 
             connectionPassword="mypass"/>
      </providers>
    </membership>
    <!--- usual config stuff omitted -->
   </system.web>
</configuration>


上面的代码适用于基本身份验证,但您可能需要重写一些其他方法来处理密码重置、查找等。如果帐户是SQL而不是AD,则可能需要实现从ActiveDirectoryMembershipProvider继承的自定义MembershipProvider

至少,您需要重写
ValidateUser
,以便在
base.ValidateUser
返回false时,您可以尝试验证SQL数据库中的用户。下面的代码示例适用于我的测试应用程序,但是我没有实现SQL方法。这对你来说应该很直接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using System.Configuration;
using System.Configuration.Provider;

namespace Research.Web.Security
{
    public class MixedMembershipProvider : ActiveDirectoryMembershipProvider
    {
        protected String SqlConnectionString { get; private set; }

        private String GetConnectionString(String connectionStringName)
        {
            if (string.IsNullOrEmpty(connectionStringName))
                throw new ProviderException("ConnectionStringName must be specified.");

            ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[connectionStringName];
            if (settings == null)
            {
                throw new ProviderException(String.Format("Connection string {0} not found.", connectionStringName));
            }
            return settings.ConnectionString;
        }

        public override void Initialize(String name, System.Collections.Specialized.NameValueCollection config)
        {
            this.SqlConnectionString = GetConnectionString(config["sqlConnectionStringName"]);
            config.Remove("sqlConnectionStringName");

            base.Initialize(name, config);
        }

        public override Boolean ValidateUser(String username, String password)
        {
            if (!base.ValidateUser(username, password)) // validate using AD first
            {
                return ValidateUserSql(username, password); // if not in AD, check SQL
            }
            else
            {
                return true;
            }
        }

        private Boolean ValidateUserSql(String username, String password)
        {
            // look up your account in SQL here
            return true;
        }
    }
}
您的web配置如下所示:

<configuration>
  <!-- usual config stuff omitted -->
  <connectionStrings>
    <add name="SqlDefault" connectionString="Server=localhost;database=mydatabase;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
    <add name="ActiveDirectoryDefault" connectionString="LDAP://mydomain.com/DC=mydomain,DC=com" />
  </connectionStrings>

   <system.web>
 <!-- usual config stuff omitted -->
   <membership defaultProvider="Mixed">
      <providers>
        <clear/>
        <add name="Mixed"
             type="Research.Web.Security.MixedMembershipProvider, Research.Web"
             applicationName="/"
             connectionStringName="ActiveDirectoryDefault"
             sqlConnectionStringName="SqlDefault"
             connectionUsername="mydomain\myadmin" 
             connectionPassword="mypass"/>
      </providers>
    </membership>
    <!--- usual config stuff omitted -->
   </system.web>
</configuration>

上面的代码将用于基本身份验证,但您可能需要重写一些其他方法来处理密码重置、查找等,以防帐户使用SQL而不是AD