web-dev-qa-db-ja.com

ASP.NETIdentityがユーザーデータを格納するデータベースを変更します

次のように、新しいASP.NET4.5.1プロジェクトを作成しました。

  • Visual Studio 2013
  • 新しい計画
  • ビジュアルC#
  • Web
  • ASP.NETWebアプリケーション
  • Web API
  • 認証の変更
  • 個々のユーザーアカウント
  • 大丈夫>大丈夫

ソリューションエクスプローラー> 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
    };
}
15
Shaun Luttin

@ ta.speot.isと@Shaunが述べたことに加えて、コンテキスト内の接続文字列(web.configに格納されている)の名前をIdentityDbContextの ベースコンストラクター に渡すこともできます。

public class MyDbContext : IdentityDbContext<MyUser>
{
  public MyDbContext()
    : base("TheNameOfTheConnectionString")
  {
  }
}

この tutorial には、広範な例が含まれています。

もう1つの方法は、接続文字列の名前をコンテキストコンストラクターのパラメーターとして使用し、それを基本コンストラクターに渡すことです。

8
Horizon_Net

独自のDbContextUserStoreコンストラクターに渡すか、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および関連するクラスのインスタンスメンバーは、スレッドセーフであることが保証されていないことに注意してください。

それで全部です。

7
Shaun Luttin