ASP.NET 5でのカスタムユーザーストアとRoleStoreの使用

asp.net-core-mvc asp.net-identity-3 c# entity-framework-core

質問

私はASP.NET 5、MVC 6、EF 7、およびアイデンティティ3を使用している私のプロジェクトのカスタムRoleStoreとカスタムUserStoreを実装しました。しかし、自分のRoleStoreを使用するようにアイデンティティを設定する方法を理解することはできません。通常のオファリングではなくカスタムのUserStoreを使用します。カスタムクラスを使用するようにシステムを再構成するにはどうすればよいですか?

PS:カスタムユーザーとロールクラスもあります。

溶液

ここで私は何をやったのですか。まず、私のプロジェクトから「Identity Entity Framework」パッケージをアンインストールしました。これは欠けているものがいくつか送られてきたので、私はそれらを再実装しました(読んでここからコピーしまし )。そしてそれらをカスタマイズしていないことを示すために「標準」名前空間に入れます。私は今、次を含む 'Security'名前空間を持っています:

  • 標準
    • IdentityRole.cs
    • IdentityRoleClaim.cs
    • IdentityUser.cs
    • IdentityUserClaim.cs
    • IdentityUserLogin.cs
    • IdentityUserRole.cs
  • BuilderExtensions.cs
  • IdentityDbContext.cs
  • Resources.resx
  • Role.cs
  • RoleStore.cs
  • User.cs
  • UserStore.cs

太字で表示されている項目には、プロジェクト固有の機能が含まれています。

私がカスタムストアを使用できるようにするコードは、次のクラスを含む 'BuilderExtensions'ファイルにあります。

public static class BuilderExtensions
{
    public static IdentityBuilder AddCustomStores<TContext, TKey>(this IdentityBuilder builder)
        where TContext : DbContext
        where TKey : IEquatable<TKey>
    {
        builder.Services.TryAdd(GetDefaultServices(builder.UserType, builder.RoleType, typeof(TContext), typeof(TKey)));
        return builder;
    }

    private static IServiceCollection GetDefaultServices(Type userType, Type roleType, Type contextType, Type keyType)
    {
        var userStoreType = typeof(UserStore<,,,>).MakeGenericType(userType, roleType, contextType, keyType);
        var roleStoreType = typeof(RoleStore<,,>).MakeGenericType(roleType, contextType, keyType);
        var services = new ServiceCollection();
        services.AddScoped(
            typeof(IUserStore<>).MakeGenericType(userType),
            userStoreType);
        services.AddScoped(
            typeof(IRoleStore<>).MakeGenericType(roleType),
            roleStoreType);
        return services;
    }
}

これにより、Startup.csファイルに次のような記述ができます。

services.AddIdentity<User, Role>()
    .AddCustomStores<PrimaryContext, string>()
    .AddDefaultTokenProviders();

カスタムストアが使用されます。 PrimaryContextは私のプロジェクト全体のDbContextの名前です。 IdentityDbContextから継承します。

討論

私はおそらく 'Identity Entity Framework'パッケージを保持していて、自分自身を保存して '標準'名前空間の内容を複製することができましたが、識別子を短く明瞭に保てないように選択しました。

人気のある回答

このセクションをチェックするASP.NET IDのカスタムストレージプロバイダの概要で新しいストレージプロバイダを使用するようにアプリケーションを再構成する

具体的には、「デフォルトのストレージプロバイダがプロジェクトに含まれている場合は、デフォルトのプロバイダを削除してプロバイダに置き換える必要があります。

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
{
    var manager = new ApplicationUserManager(new YourNewUserStore(context.Get<ExampleStorageContext>()));
    ...
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ