在ASP.NET 5中使用自定義UserStore和RoleStore

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

我已經為使用ASP.NET 5,MVC 6,EF 7和Identity 3的項目實現了自定義RoleStore和自定義UserStore。但是 - 我無法弄清楚如何配置身份以使用我的自定義RoleStore和自定義UserStore而不是通常的產品。如何重新配置​​系統以使用我的自定義類?

PS:我也有自定義用戶和角色類。

這就是我最終做的事情。首先,我從我的項目中卸載了“身份實體框架”包。這會丟失一些東西,所以我重新實現了它們(讀取:從這裡複製它們),並將它們放在“標準”命名空間中以表明它們沒有被自定義。我現在有一個'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。

討論

我本可以保留“身份實體框架”包並保存自己複製“標準”命名空間的內容,但我選擇不這樣做,以便我可以保持我的標識符簡短明確。

熱門答案

請查看本節重新配置應用程序以在ASP.NET身份的自定義存儲提供程序概述中使用新的存儲提供程序

特別是“如果項目中包含默認存儲提供程序,則必須刪除默認提供程序並將其替換為提供程序。”

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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow