29

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

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

私の状況では 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 ディレクティブまたはアセンブリ参照がありませんか?)

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 ディレクティブまたはアセンブリ参照がありませんか? ?)

4

3 に答える 3

38

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

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

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*用に既に用意されている独自のバージョンのクラスを定義する必要がある場合もあります。したがって、保存するユーザーを表す独自のクラスと、ユーザーのクレームが必要になります。私はこれを自分でやったことがないので、正確にはわかりませんが、あなたはこれをしなければならないと感じています.IdentityUserIdentityUserClaim

Scott Allen は、役に立つかもしれないモデルのさまざまなビットに関する優れた記事を持っています。

この行の問題については:

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

which extendsGenerateUserIdentityAsyncで定義されている whichというメソッドがあります。それは私が信じているテンプレートプロジェクトで定義されており、次のようになります。ApplicationuserIdentityUser

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)代わりに呼び出すなど) 。

于 2014-07-06T19:06:39.077 に答える
1

私は自分自身のアイデンティティにかなり慣れていません。User エンティティは 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
        );
    }   
于 2014-07-03T08:59:48.160 に答える
1

これは最近、次のように更新されたと思います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);
于 2017-06-27T14:37:18.307 に答える