web-dev-qa-db-ja.com

ASP.NET Identityモデルをクラスライブラリに移動する

このリンクのメソッドを使用して、アイデンティティモデルをクラスライブラリに移動しようとしています。

サービスライブラリのASP.NET ID

問題1:ウェブサイトプロジェクトの接続文字列を使用し続けるようです。クラスライブラリで完全な接続文字列を指定することで、それを克服しました。 IdentityDbContextにクラスライブラリの接続文字列を使用させることはできますか?

問題2:問題1により、WebサイトプロジェクトからEntity Frameworkを削除した場合。 WebsiteプロジェクトでEFのSqlClientを探しているという次のエラーが表示されます。

EntityFramework.dllでタイプ 'System.InvalidOperationException'の例外が発生しましたが、ユーザーコードでは処理されませんでした

追加情報:不変名「System.Data.SqlClient」を持つADO.NETプロバイダーのEntity Frameworkプロバイダーが見つかりません。プロバイダーがアプリケーション構成ファイルの「entityFramework」セクションに登録されていることを確認してください。詳細については、 http://go.Microsoft.com/fwlink/?LinkId=260882 を参照してください。

ウェブサイトプロジェクトでEFのようなすべてのデータアクセスレイヤー参照を省略している限り、他のソリューションも歓迎します。

40
Joe Yap

IdentityModelをクラスライブラリに移動するには(これは [〜#〜] srp [〜#〜] に従って正しいことです)、次の手順に従います。

  1. クラスライブラリを作成します。 (ClassLibrary1)
  2. NuGetを使用して、Microsoft.AspNet.Identity.EntityFrameworkへの参照を追加します。これにより、他の参照も自動的に追加されます。
  3. WebサイトでClassLibrary1に参照を追加します
  4. WebSite/Models/IdentityModel.csを見つけて、ClassLibrary1に移動します。
  5. IdentityModel.csを次のようにします。

    public class ApplicationUser : IdentityUser
    {
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("YourContextName")
        {
        }
    }
    
  6. WebサイトのWeb.configに、セクション内の適切なデータベースを指すYourContextNameがあることを確認してください。 (注:このデータベースは、アプリケーションデータを格納できますし、格納する必要があります)。

    <add name="YourContextName" connectionString="YourConnectionStringGoesHere"
      providerName="System.Data.SqlClient" />
    
  7. EF ContextクラスをApplicationDbContextから継承します。

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

サイト内の誰かがログインまたは登録しようとすると、IDシステムは、IDテーブルを含むデータallを使用してデータベースにルーティングします。

行ってもいい!

67
Rap

EF6およびIdentity 2.0に対する@Rapの回答の更新:

  1. クラスライブラリを作成します。 (ClassLibrary1)
  2. NuGetを使用して、Microsoft.AspNet.Identity.EntityFrameworkおよびMicrosoft.AspNet.Identity.Owinへの参照を追加します。
  3. WebサイトでClassLibrary1に参照を追加します
  4. WebSite/Models/IdentityModel.csを見つけて、ClassLibrary1に移動します。
  5. IdentityModel.csは次のようになります。何も変更する必要はありません。

    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
            // Add custom user claims here
            return userIdentity;
        }
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
    
  6. WebサイトのWeb.configに、セクション内の適切なデータベースを指すコンテキストがあることを確認してください。 (注:このデータベースは、アプリケーションデータを格納できますし、格納する必要があります)。

    <connectionStrings>
      <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  7. EF ContextクラスをApplicationDbContextから継承します。

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    
7
Ogglas

Identityをクラスライブラリに移動するとはどういう意味ですか?参照として使用するには?カスタムユーザーマネージャーとユーザーは別のライブラリにありますが、それだけです。

IDスタッフには、ある種のデータストアが必要です。 IdentityでEFを使用するように構成する場合は、追加のnugetパッケージを取得してください。コンテキストの作成時に接続文字列を渡すことができるはずです。

頭の上から...

var mgr = new UserManager<ApplicationUser>(
     new IUserStore_ofYourChoice<ApplicationUser>(
       new DbContextName("ConnectionStringOverload"));

EFストアは「UserStore」だと思うので、確認する必要があります。

現在、Identityのデータストアには、約12種類の異なるNugetパッケージがあります。 EFを使用する必要はありませんが、何らかのストアが必要です。

**編集**

また、参照として、デフォルトでメインプロジェクトの設定、したがって定義された接続文字列を常に使用しますが、それはその動作方法を想定しているので大丈夫です。

1
William

いくつかのルールを認識し、覚えておく必要があります。

最初に、Webプロジェクトは常に、独自のプロジェクト期間で見つかったweb.configファイルを使用します。ソリューションの他の構成ファイルに何を入れても問題ありません。 Webプロジェクトは、自身のプロジェクトで見つかったもののみを使用できます。別のプロジェクトに接続文字列がある場合、それをWebプロジェクトに複製する必要があります。そうしないと、接続文字列が見つかりません。

次に、Webプロジェクトがスタートアッププロジェクトであり、データ移行を使用していると仮定すると(Identityが使用するため)、パッケージマネージャーは常にスタートアッププロジェクトで見つかった接続文字列を使用することに注意してください。そのため、update-databaseのパッケージマネージャーは、モデルプロジェクトで接続文字列を使用しません。

簡単な解決策は次のとおりです。1.接続文字列をモデルプロジェクトからWebプロジェクトにコピーします。 2.パッケージマネージャーコンソールで、コンテキストを選択するドロップダウンがモデルプロジェクトを指していることを確認します。

1
silverfox1948

質問1:-

以下のリンクにある解決策を使用できると思います:-

動的接続文字列のエンティティフレームワークのセットアップ

質問2:-

エンティティフレームワークは、実行時にそのプロジェクトのweb.configを使用する方法を構築すると考えています。マイクロソフトからの指示も示唆しています

http://msdn.Microsoft.com/en-us/library/vstudio/cc716677(v = vs.100).aspx

0
Joe Yap