我的任务是处理我的 .Net Web 应用程序的安全性,它的工作方式是,如果用户登录到 Active Directory 并且用户的 AD 名称在数据库中,那么他们将被允许进入。
同样,如果用户的 AD 名称不在数据库中,那么他们将被要求使用数据库中保存的用户名和密码登录。
因此,我需要使用 Membership 和 Role 提供程序的某种混合模式安全登录。
我遇到问题的地方是您在哪里检测用户是否可以使用 AD 登录,以便他们自动登录。
我的任务是处理我的 .Net Web 应用程序的安全性,它的工作方式是,如果用户登录到 Active Directory 并且用户的 AD 名称在数据库中,那么他们将被允许进入。
同样,如果用户的 AD 名称不在数据库中,那么他们将被要求使用数据库中保存的用户名和密码登录。
因此,我需要使用 Membership 和 Role 提供程序的某种混合模式安全登录。
我遇到问题的地方是您在哪里检测用户是否可以使用 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;
}
}
}
你的网络配置看起来像这样:
<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 中。