次のように、新しいASP.NET4.5.1プロジェクトを作成しました。
ソリューションエクスプローラー> App_Start> Startup.Auth.csファイルには、ASP.NETIndentityを構成する次のコードがあります。 UserManagerがユーザーデータを保存するデータベースをどのように変更しますか?
static Startup()
{
PublicClientId = "self";
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
}
@ ta.speot.isと@Shaunが述べたことに加えて、コンテキスト内の接続文字列(web.configに格納されている)の名前をIdentityDbContextの ベースコンストラクター に渡すこともできます。
public class MyDbContext : IdentityDbContext<MyUser>
{
public MyDbContext()
: base("TheNameOfTheConnectionString")
{
}
}
この tutorial には、広範な例が含まれています。
もう1つの方法は、接続文字列の名前をコンテキストコンストラクターのパラメーターとして使用し、それを基本コンストラクターに渡すことです。
独自のDbContext
をUserStore
コンストラクターに渡すか、DefaultConnection
という名前のWeb.config接続文字列を変更します。いずれにせよ、@ ta.speot.isによるコメントは正しいです。
正解
// do this - it's the factory pattern
UserManagerFactory
= () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext()));
不正解
// do NOT do this - use the preceding code.
var userStore = new UserStore<IdentityUser>(new MyDbContext());
var userManager = new UserManager<IdentityUser>(userStore);
UserManagerFactory = () => userManager;
詳細
UserStore
クラスは、非常に基本的なユーザー管理APIを公開します。コードでは、ユーザーデータをタイプIdentityUser
としてMyDbContext
データストアに格納するように構成します。
UserManager
クラスは、UserStore
への変更を自動的に保存する高レベルのユーザー管理APIを公開します。コードでは、作成したばかりのUserStore
を使用するように構成します。
UserManagerFactory
は、アプリケーションのリクエストごとにUserManager
のインスタンスを1つ取得するために、ファクトリパターンを実装する必要があります。そうしないと、次の例外が発生します。
モデルの作成中は、コンテキストを使用できません。この例外は、コンテキストがOnModelCreatingメソッド内で使用されている場合、または同じコンテキストインスタンスが複数のスレッドによって同時にアクセスされている場合にスローされる可能性があります。 DbContextおよび関連するクラスのインスタンスメンバーは、スレッドセーフであることが保証されていないことに注意してください。
それで全部です。