精简版:
如何使用自定义成员资格提供程序通过 SQL 用户数据库针对多个域验证用户,以便在用户第一次登录时,将在用户数据库中输入所有必要信息?有没有办法在 AD 进入 SQL 数据库之前修改一些来自 AD 的信息,例如解析一些字段?
长版:
我正在开发一个让我头疼的 MVC4 Web 应用程序。用户将从两个域 (dc=domainone,dc=company,dc=com) 和 (dc=domaintwo,dc=company,dc=com) 登录。第一个域是一个相对标准的域,大约有 1000 个用户。没有什么花哨。第二个域中有两种类型的用户:具有“实时”密码的用户(大约 100 个用户),这意味着用户可以直接针对域进行身份验证,以及具有作为盐渍哈希存储在额外字段中的密码的用户在目录中(远超过 200,000 个用户)。对于后面的这些用户,我必须从目录中获取存储的 salted-hash,对他们在登录时输入的密码进行哈希处理并比较两者。我在下面的自定义 MembershipProvider 中进行了身份验证,没有问题。
但是,我在 SQL 中的用户表在登录时没有填充用户信息。我有必要为用户表使用 SQL 数据库,而不是单独使用 AD 信息,因为 AD 中有几个必要的字段是未经解析,我的应用程序无法使用。例如,对于 Jane Smith,employeeNumber 字段可能为“12345”,而对于 Joe Smith,该字段可能为空白,他的员工编号是其 DN 的一部分,如 DN="CN=Joe Smith <#1234>,DC=domainone, DC=公司,DC=com"
会员提供者
public override bool ValidateUser(string username, string password)
{
CompanyAuthenticationService connectionToAD = new CompanyAuthenticationService ();
//Test US domain log in first
if (connectionToAD.ValidateAgainstAD(username, password,"domainone"))
return true;
//Test Team domain log in next
if (connectionToAD.ValidateAgainstAD(username, password,"domaintwo"))
return true;
//Test Team Hash last
if (connectionToAD.ValidateAgainstTeamHash(username, password))
return true;
return false;
}
//all other methods are not implemented
网络配置
//几行被截断
<connectionStrings>
<add name="ProgramNameDB"
connectionString="data source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=ProgramName"
providerName="System.Data.SqlClient" />
</connectionStrings>
//几行被截断
<authentication mode="Forms">
<forms loginUrl="/Account/Login" timeout="30"/>
</authentication>
//几行被截断
<profile defaultProvider="DefaultProfileProvider">
<providers>
<add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="ProgramNameDB" applicationName="/" />
</providers>
</profile>
<membership defaultProvider="ProgramNameMembershipProvider">
<providers>
<clear/>
<add name="ProgramNameMembershipProvider"
type="ProgramName.Services.Security.MembershipProviders.ProgramNameMembershipProvider" />
</providers>
</membership>
<roleManager defaultProvider="ProgramNameRoleProvider" cacheRolesInCookie="true" enabled="true" cookieTimeout="120" createPersistentCookie="false">
<providers>
<add name="ProgramNameRoleProvider" type="ProgramName.Services.Security.RoleProviders.ProgramNameRoleProvider" connectionStringName="ProgramNameDB" applicationName="/" />
</providers>
</roleManager>