短縮版:
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>