具有SQL用户表的自定义MembershipProvider

时间:2012-06-05 16:21:06

标签: c# asp.net sql-server asp.net-mvc active-directory

简短版本:

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

长版:

我正在开发一个令我头痛的MVC4 Web应用程序。用户将从两个域(dc = domainone,dc = company,dc = com)和(dc = domaintwo,dc = company,dc = com)登录。第一个域是一个相对标准的域,拥有大约1000个用户。没有什么花哨。第二个域中有两种类型的用户:具有“实时”密码(大约100个用户)的用户,这意味着用户可以直接对域进行身份验证,以及具有在额外字段中存储为salted哈希的密码的用户目录内(超过200,000个用户)。对于后面这些用户,我必须从目录中获取存储的salted-hash,哈希他们在登录时输入的密码并比较两者。我在下面的自定义MembershipProvider中正常运行身份验证。

但是,SQL中的用户表在登录时没有填充用户的信息。我有必要将SQL数据库用于用户的表,而不是单独使用AD信息,因为其中有几个必要的字段我的应用程序无法使用的AD,而不是先解析。例如,对于Jane Smith,employeeNumber字段可以具有“12345”,并且对于Joe Smith,该字段可以是空白的,他的雇员号码是其DN的一部分,如在DN =“CN = Joe Smith<#1234&gt ;, DC = domainone ,DC =公司,DC = COM“

的MembershipProvider

    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

的web.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>

1 个答案:

答案 0 :(得分:1)

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

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