web-dev-qa-db-ja.com

カスタムテーブルを使用したIdentity 2.0

私はASP.NET IDを初めて使用しますが、それでもすべてがどのように機能するかについて頭を悩ませています。残念ながら、私が試したチュートリアルの多くはIdentity 1.0向けであることがわかりましたが、Identity 2.0での作業を試みています。

私が直面している最大の問題は、単純だと思っていたが、そうではないことが判明したことです。私がやろうとしているのは、既存のユーザーテーブルを持つ既存のデータベースを使用することです。現在、Identityを取得して、ユーザーデータを格納する独自のテーブルを作成するだけです。 Entity Frameworkを使用したくありませんが、Entity FrameworkをIdentity 2.0から分離するのは非常に困難でした。

私の状況ではSQL Serverを使用していますが、次のリンクでMySQLのカスタムプロバイダーを試して実装しようと思いました: http://www.asp.net/identity/overview/extensibility/implementing-a -custom-mysql-aspnet-identity-storage-provider および https://github.com/raquelsa/AspNet.Identity.MySQL これは、Identity 1でのみ機能するようです。新しいものがあるようですが、Entity Frameworkを使用しています。 https://github.com/ILMServices/RavenDB.AspNet.Identity も試しました。

私が試したすべてのことで、私は次の行で立ち往生します:

var manager = new IdentityUserManager(new UserStore<IdentityUser>(context.Get<ApplicationDbContext>()));

私が直面している問題は、RavenDBの指示に従ってApplicaitonDbContextクラスを削除する必要があることですが、代わりにこの行に何を入れるべきかわかりません。

私が得るエラーは次のとおりです。

非ジェネリック型 'AspNet.Identity.MySQL.UserStore'は、型引数と共に使用できません

そして

型または名前空間名「ApplicationDbContext」が見つかりませんでした(usingディレクティブまたはAssembly参照がありませんか?)

2番目のエラーは予想されるものですが、このコード行で何を使用するかはわかりません。 Entity Frameworkを使用せずにカスタムプロバイダーを実装した経験はありますか?

ありがとう。

更新1:

私は次のチュートリアルを試みました[ http://aspnetguru.com/customize-authentication-to-your-own-set-of-tables-in-asp-net-mvc-5/ ]ただし、チュートリアルを正確に実行すると、コンパイルエラーまたは実行時エラーが発生し、不完全なように見えます。まだいくつかの問題があります...

「ApplicationUser」のすべてのインスタンスを「User」に置き換えると、IdentityConfig.csの次の行に問題があります

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<MyDbContext>()));

ApplicationUserをUserに変更すると、次のエラーが発生します

型 'WebApplicationTest2.Models.User'は、ジェネリック型またはメソッド 'Microsoft.AspNet.Identity.EntityFramework.UserStore'の型パラメーター 'TUser'として使用できません。 「WebApplicationTest2.Models.User」から「Microsoft.AspNet.Identity.EntityFramework.IdentityUser」への暗黙的な参照変換はありません。

また、ユーザーマネージャーと多くのASyncメソッドの使用方法を理解するのに苦労しています。次の行は機能しません。

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, await user.GenerateUserIdentityAsync(UserManager));

AccountController.csに次のエラーがあります。

「Microsoft.Owin.Security.IAuthenticationManager.SignIn(Microsoft.Owin.Security.AuthenticationProperties、params System.Security.Claims.ClaimsIdentity [])」に最もよくオーバーロードされたメソッドには、いくつかの無効な引数があります。

「WebApplicationTest2.Models.User」には「GenerateUserIdentityAsync」の定義が含まれておらず、タイプ「WebApplicationTest2.Models.User」の最初の引数を受け入れる拡張メソッド「GenerateUserIdentityAsync」が見つかりません(usingディレクティブまたはアセンブリ参照がありません) ?)

29
joshhendo

あなたの例では、DbContextを他の何かに置き換えたいようですが、実際には、1レベル上の努力に集中する必要があると思います。

フレームワークには、UserManagerクラスがあります。このクラスは、ユーザーとその関連情報を管理しますが、保存はしません。ユーザー(またはその関連情報)を保存する場合、デフォルトでは、IdentityUserを使用してDbContextインスタンスをデータベースに保存する方法を知っている_UserStore<IdentityUser>_を使用します。

2.0フレームワークでは、IDストアのさまざまな部分がいくつかのインターフェイスに分割されていました。デフォルトの実装である_UserStore<IdentityUser>_はこれらのインターフェースのいくつかを実装し、DBContextを使用してそれらすべてのデータをデータベースに保存します。

デフォルトで提供されるエンティティフレームワークベースのUserStoreの定義を見ると、これらの小さなインターフェイスの多くが実装されていることがわかります。

_public class UserStore<TUser, TRole, TKey, TUserLogin, TUserRole, TUserClaim> : IUserLoginStore<TUser, TKey>, 
IUserClaimStore<TUser, TKey>, IUserRoleStore<TUser, TKey>, IUserPasswordStore<TUser, TKey>, 
IUserSecurityStampStore<TUser, TKey>, IQueryableUserStore<TUser, TKey>, IUserEmailStore<TUser, TKey>, 
IUserPhoneNumberStore<TUser, TKey>, IUserTwoFactorStore<TUser, TKey>, IUserLockoutStore<TUser, TKey>, 
IUserStore<TUser, TKey>, IDisposable 
where TUser : IdentityUser<TKey, TUserLogin, TUserRole, TUserClaim>
where TRole : IdentityRole<TKey, TUserRole>
where TKey : Object, IEquatable<TKey>
where TUserLogin : new(), IdentityUserLogin<TKey>
where TUserRole : new(), IdentityUserRole<TKey>
where TUserClaim : new(), IdentityUserClaim<TKey>
_

Entity Frameworkをまったく使用したくないので、データを保存する場所にそのデータを保存するこれらの主要なインターフェイスのいくつかの独自の実装を提供する必要があります。メインインターフェイスは _IUserStore<Tuser,TKey>_ です。これは、特定のタイプのキーを持つユーザーを格納するための契約を定義します。ユーザーのみを保存し、他の情報は保存しない場合は、このインターフェイスを実装してから、実装をUserManagerに渡すことができます。

ユーザーのパスワード、ロール、ログインなどが必要になる可能性がありますが、これで十分であるとは考えられません。その場合は、_IUserStore<Tuser,TKey>_を実装するクラスに_IUserPasswordStore<TUser, TKey>_、_IRoleStore<TRole, TKey>_および_IUserClaimStore<TUser, TKey>_も実装する必要があります。

すべてのインターフェイスのリストを見つけることができます MSDNで

使用するビットに応じて、これらのインターフェイスを実装する必要があります。

また、おそらく、独自のバージョンの_Identity*_クラスを定義する必要があります。このクラスは、 既存のエンティティフレームワーク に存在します。そのため、保存するユーザーを表す独自のIdentityUserクラスと、ユーザークレーム用のIdentityUserClaimが必要になります。私はこれを自分でやったことがないので正確にはわかりませんが、私の気持ちはあなたがこれをしなければならないということです。

Scott Allenには、役に立つかもしれないモデルのさまざまな部分について good article があります。

この行の問題に関して:

_AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, await user.GenerateUserIdentityAsync(UserManager));
_

GenerateUserIdentityAsyncと呼ばれるメソッドがあり、Applicationuserを拡張するIdentityUserで定義されています。私が信じているテンプレートプロジェクトで定義されており、次のように見えます:

_public class ApplicationUser : IdentityUser 
{    
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
    UserManager<ApplicationUser> manager) {
    // Note the authenticationType must match the one 
    // defined in CookieAuthenticationOptions.AuthenticationType
    var userIdentity = 
        await manager.CreateIdentityAsync(this, 
            DefaultAuthenticationTypes.ApplicationCookie);
    // Add custom user claims here
    return userIdentity;
    }
}
_

エンティティフレームワークIdentityUserを使用していないので、同様のメソッドまたは独自のUserクラスを定義するか、他の方法で同じ機能を実装する必要があります(単にawait manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie)代わりに)

38
Sam Holder

私自身、アイデンティティーはかなり新しいです。ユーザーエンティティはIUserインターフェイスを実装していますか?例えば.

public partial class User : IUser<Guid> //Whatever your key is
{
    public Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
    {
        return Task.FromResult(GenerateUserIdentity(manager));
    }

    public ClaimsIdentity GenerateUserIdentity(ApplicationUserManager manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = manager.CreateIdentity<User, Guid>(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

次に、サインインするために上記を呼び出すことができます:

public async Task SignInAsync(User user, bool isPersistent)
    {
        var userIdentity = await user.GenerateUserIdentityAsync(UserManager);
        AuthenticationManager.SignIn(
            new AuthenticationProperties
            {
                IsPersistent = isPersistent
            },
            userIdentity
        );
    }   
1
Jenkie

これは最近ApplicationUserで更新されたと思います:

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;
}

AccountController-> GetExternalLoginからこのように呼び出されます

ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager,
    OAuthDefaults.AuthenticationType);
ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager,
    CookieAuthenticationDefaults.AuthenticationType);
1
Ogglas