具有 SQL 用户表的自定义成员资格提供程序

本文关键字:程序 成员 自定义 SQL 用户 具有 | 更新日期: 2023-09-27 18:36:16

简短版本:

如何使用自定义成员资格提供程序,该提供程序通过 SQL 用户数据库根据多个域验证用户,以便在用户首次登录时,将使用用户数据库中的所有必要信息在用户数据库中创建一个条目? 有没有办法在 AD 进入 SQL 数据库之前修改来自 AD 的某些信息,例如解析某些字段?

长版本:

我正在开发一个让我头疼的 MVC4 Web 应用程序。 用户将从两个域登录(dc=domainone,dc=company,dc=com)和(dc=domaintwo,dc=company,dc=com)。 第一个域是一个相对标准的域,大约有 1000 个用户。 没什么好看的。 第二个域中有两种类型的用户:具有"实时"密码的用户(大约 100 个用户),这意味着用户可以直接对域进行身份验证,以及密码作为加盐哈希存储在目录中的额外字段中的用户(超过 200,000 个用户)。 对于后这些用户,我必须从目录中获取存储的加盐哈希,对他们在登录时输入的密码进行哈希处理并比较两者。 我在下面的自定义会员提供程序中进行身份验证没有问题。

但是,我在SQL中的用户表在登录时没有填充用户的信息。 我有必要将 SQL 数据库用于用户的表,而不是单独的 AD 信息,因为 AD 中有几个必要的字段,如果不先分析,我的应用程序将无法使用这些字段。 例如,员工编号字段可能具有 Jane Smith 的"12345",而 Joe Smith 的该字段可能是空白的,他的员工编号是其 DN 的一部分,如 DN="CN=Joe Smith <#1234>,DC=domainone,DC=company,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

网络.config

几行被截断

<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>

具有 SQL 用户表的自定义成员资格提供程序

您必须调用 Membership.CreateUser 方法来创建新用户。 可以将其放在 ValidateUser 方法中,也可以放在 Login 控件的 LoggedIn 事件中。 显然,在调用 CreateUser 之前,您需要先检查登录用户是否已存在于数据库中...

有关登录事件的更多信息:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.loggedin.aspx