我已经为使用ASP.NET 5,MVC 6,EF 7和Identity 3的项目实现了自定义RoleStore和自定义UserStore。但是 - 我无法弄清楚如何配置身份以使用我的自定义RoleStore和自定义UserStore而不是通常的产品。如何重新配置系统以使用我的自定义类?
PS:我也有自定义用户和角色类。
这就是我最终做的事情。首先,我从我的项目中卸载了“身份实体框架”包。这会丢失一些东西,所以我重新实现了它们(读取:从here复制它们),并将它们放在“标准”命名空间中以表明它们没有被自定义。我现在有一个'Security'命名空间,其中包含以下内容:
以粗体显示的项目包含项目特定功能。
允许我使用自定义商店的代码位于“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。
我本可以保留“身份实体框架”包并保存自己复制“标准”命名空间的内容,但我选择不这样做,以便我可以保持标识符的简洁和明确。
答案 0 :(得分:1)
查看此部分 重新配置应用程序以在Overview of Custom Storage Providers for ASP.NET Identity
中使用新的存储提供程序具体而言#34;如果您的项目中包含默认存储提供程序,则必须删除默认提供程序并将其替换为您的提供程序。&#34;
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new YourNewUserStore(context.Get<ExampleStorageContext>()));
...
}