1

短縮版:

SQLユーザーデータベースを使用して複数のドメインに対してユーザーを検証するカスタムメンバーシッププロバイダーを使用して、ユーザーの最初のログイン時に、必要なすべての情報を使用してユーザーデータベースにエントリを作成するにはどうすればよいですか?一部のフィールドを解析する場合のように、SQLデータベースに入る前にADから取得した情報の一部を変更する方法はありますか?

ロングバージョン:

私は頭痛の種になっているMVC4Webアプリケーションに取り組んでいます。ユーザーは、2つのドメイン(dc = domainone、dc = company、dc = com)と(dc = domaintwo、dc = company、dc = com)からログインします。最初のドメインは、約1000人のユーザーがいる比較的標準的なドメインです。特別なことは何もありません。2番目のドメインには2つのタイプのユーザーがあります。ユーザーがドメインに対して直接認証できることを意味する「ライブ」パスワード(約100ユーザー)を持つユーザーと、追加フィールドにソルトハッシュとして保存されるパスワードを持つユーザーです。ディレクトリ内(200,000ユーザーをはるかに超える)。これらの後者のユーザーの場合、ディレクトリからその保存されたソルトハッシュを取得し、ログイン時に入力したパスワードをハッシュして、2つを比較する必要があります。以下のカスタムMembershipProviderで問題なく認証が機能しています。

ただし、SQLのユーザーテーブルにログイン時にユーザー情報が入力されていません。AD内にはいくつかの必要なフィールドがあるため、AD情報だけでなく、ユーザーテーブルにSQLデータベースを使用する必要があります。最初に解析しないと、アプリケーションで使用できません。たとえば、Jane SmithのemployeeNumberフィールドには「12345」が含まれ、Joe Smithの場合、DN = "CN = Joe Smith <#1234>、DC = domainone、 DC = company、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>
4

1 に答える 1

1

Membership.CreateUser新しいユーザーを作成するには、メソッドを呼び出す必要があります。これは、ValidateUserメソッド、またはLoginコントロールのLoggedInイベント内に配置できます。明らかに、CreateUserを呼び出す前に、ログインしたユーザーがデータベースにすでに存在するかどうかを最初に確認する必要があります...

LoggedInイベントの詳細については、http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.loggedin.aspxを参照してください。

于 2012-06-05T17:08:46.570 に答える