问题描述
我正在构建一个完全自定义的AspNetCore.Identity实现,因为我希望TKey
成为System.Guid
.相对而言,我已经推导了...的类型
I'm building a completely custom AspNetCore.Identity Implementation because I want TKey
to be System.Guid
across the board. With respect, I have derived types for...
-
Role : IdentityRole<Guid, UserRole, RoleClaim>
-
RoleClaim : IdentityRoleClaim<Guid>
-
User : IdentityUser<Guid, UserClaim, UserRole, UserLogin>
-
UserClaim : IdentityUserClaim<Guid>
-
UserLogin : IdentityUserLogin<Guid>
-
UserRole : IdentityUserRole<Guid>
-
UserToken : IdentityUserToken<Guid>
-
ApplicationDbContext : IdentityDbContext<User, Role, Guid, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
-
ApplicationRoleManager : RoleManager<Role>
-
ApplicationRoleStore : RoleStore<Role, ApplicationDbContext, Guid, UserRole, RoleClaim>
-
ApplicationSignInManager : SignInManager<User>
-
ApplicationUserManager : UserManager<User>
-
**ApplicationUserStore** : UserStore<User, Role, ApplicationDbContext, Guid, UserClaim, UserRole, UserLogin, UserToken>
Role : IdentityRole<Guid, UserRole, RoleClaim>
RoleClaim : IdentityRoleClaim<Guid>
User : IdentityUser<Guid, UserClaim, UserRole, UserLogin>
UserClaim : IdentityUserClaim<Guid>
UserLogin : IdentityUserLogin<Guid>
UserRole : IdentityUserRole<Guid>
UserToken : IdentityUserToken<Guid>
ApplicationDbContext : IdentityDbContext<User, Role, Guid, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
ApplicationRoleManager : RoleManager<Role>
ApplicationRoleStore : RoleStore<Role, ApplicationDbContext, Guid, UserRole, RoleClaim>
ApplicationSignInManager : SignInManager<User>
ApplicationUserManager : UserManager<User>
**ApplicationUserStore** : UserStore<User, Role, ApplicationDbContext, Guid, UserClaim, UserRole, UserLogin, UserToken>
ApplicationUserStore
是有问题的孩子!
实施
namespace NewCo.Identity
{
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using System;
public sealed class Role : IdentityRole<Guid, UserRole, RoleClaim>
{
}
}
namespace NewCo.Identity
{
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using System;
public sealed class UserRole : IdentityUserRole<Guid>
{
}
}
namespace NewCo.Identity
{
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using System;
public sealed class RoleClaim : IdentityRoleClaim<Guid>
{
}
}
// The problem is here...
namespace NewCo.Identity
{
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using System;
using System.Security.Claims;
public sealed class ApplicationUserStore : UserStore<User, Role, ApplicationDbContext, Guid, UserClaim, UserRole, UserLogin, UserToken>
{
}
}
错误
据我所知,除非这是一些(co/contra/in)方差问题,否则所有代码都将检查出...我错了什么?
As far as I can see, unless this is some (co/contra/in)variance issue, all the code checks out...what did I get wrong?
推荐答案
您的ApplicationUserStore
最后也需要RoleClaim
(不要忘记更新相关的NuGet软件包,否则您将无法使用这些新的补充):
Your ApplicationUserStore
needs the RoleClaim
at the end too (don't forget to update the related NuGet packages, otherwise you can't use these new additions):
ApplicationUserStore : UserStore<
User, Role, ApplicationDbContext,
Guid, UserClaim, UserRole,
UserLogin, UserToken, RoleClaim>
加上您的ApplicationRoleStore
应该提供如何创建RoleClaim
,
Plus your ApplicationRoleStore
should provide how to create the RoleClaim
,
protected override RoleClaim CreateRoleClaim(Role role, Claim claim)
{
return new RoleClaim
{
RoleId = role.Id,
ClaimType = claim.Type,
ClaimValue = claim.Value
};
}
ApplicationUserStore
也应提供以下映射:
protected override UserClaim CreateUserClaim(User user, Claim claim)
{
var userClaim = new UserClaim { UserId = user.Id };
userClaim.InitializeFromClaim(claim);
return userClaim;
}
protected override UserLogin CreateUserLogin(User user, UserLoginInfo login)
{
return new UserLogin
{
UserId = user.Id,
ProviderKey = login.ProviderKey,
LoginProvider = login.LoginProvider,
ProviderDisplayName = login.ProviderDisplayName
};
}
protected override UserRole CreateUserRole(User user, Role role)
{
return new UserRole
{
UserId = user.Id,
RoleId = role.Id
};
}
protected override UserToken CreateUserToken(User user, string loginProvider, string name, string value)
{
return new UserToken
{
UserId = user.Id,
LoginProvider = loginProvider,
Name = name,
Value = value
};
}
然后将内置服务重定向到您的自定义服务:
Then redirect built-in services to your custom services:
services.AddScoped<UserStore<User, Role, ApplicationDbContext, int, UserClaim, UserRole, UserLogin, UserToken, RoleClaim>, ApplicationUserStore>();
services.AddScoped<UserManager<User>, ApplicationUserManager>();
services.AddScoped<RoleManager<Role>, ApplicationRoleManager>();
services.AddScoped<SignInManager<User>, ApplicationSignInManager>();
services.AddScoped<RoleStore<Role, ApplicationDbContext, int, UserRole, RoleClaim>, ApplicationRoleStore>();
services.AddScoped<IEmailSender, AuthMessageSender>();
services.AddScoped<ISmsSender, AuthMessageSender>();
现在介绍您的自定义服务:
now introduce your custom services:
services.AddIdentity<User, Role>(identityOptions =>
{
// ...
}).AddUserStore<ApplicationUserStore>()
.AddUserManager<ApplicationUserManager>()
.AddRoleStore<ApplicationRoleStore>()
.AddRoleManager<ApplicationRoleManager>()
.AddSignInManager<ApplicationSignInManager>()
// You **cannot** use .AddEntityFrameworkStores() when you customize everything
//.AddEntityFrameworkStores<ApplicationDbContext, int>()
.AddDefaultTokenProviders();
这篇关于ASP.NET Core-自定义AspNetCore.Identity实现不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!