ASP.NET Core: la implementación de AspNetCore.Identity personalizada no funciona

Estoy creando una implementación AspNetCore.Identity completamente personalizada porque quiero que TKey sea System.Guid todos los ámbitos. Con respeto, he derivado tipos para …

  • Role : IdentityRole
  • RoleClaim : IdentityRoleClaim
  • User : IdentityUser
  • UserClaim : IdentityUserClaim
  • UserLogin : IdentityUserLogin
  • UserRole : IdentityUserRole
  • UserToken : IdentityUserToken
  • ApplicationDbContext : IdentityDbContext
  • ApplicationRoleManager : RoleManager
  • ApplicationRoleStore : RoleStore
  • ApplicationSignInManager : SignInManager
  • ApplicationUserManager : UserManager
  • **ApplicationUserStore** : UserStore

ApplicationUserStore es el niño problema!

Implementación

 namespace NewCo.Identity { using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using System; public sealed class Role : IdentityRole { } } namespace NewCo.Identity { using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using System; public sealed class UserRole : IdentityUserRole { } } namespace NewCo.Identity { using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using System; public sealed class RoleClaim : IdentityRoleClaim { } } // 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 { } } 

Error

El tipo ‘NewCo.Identity.Role’ no se puede usar como parámetro de tipo ‘TRole’ en el tipo genérico o método ‘UserStore’. No existe una conversión de referencia implícita de ‘NewCo.Identity.Role’ a ‘Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole>’.

Por lo que puedo ver, a menos que este sea un problema de varianza (co / contra / in), todo el código verifica … ¿qué me equivoqué?

Su ApplicationUserStore necesita el RoleClaim al final (no olvide actualizar los paquetes relacionados de NuGet, de lo contrario no podrá usar estas nuevas adiciones):

  ApplicationUserStore : UserStore< User, Role, ApplicationDbContext, Guid, UserClaim, UserRole, UserLogin, UserToken, RoleClaim> 

Además, su ApplicationRoleStore debe proporcionar cómo crear el RoleClaim ,

 protected override RoleClaim CreateRoleClaim(Role role, Claim claim) { return new RoleClaim { RoleId = role.Id, ClaimType = claim.Type, ClaimValue = claim.Value }; } 

Y también ApplicationUserStore debería proporcionar estas asignaciones también:

 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 }; } 

Luego redirija los servicios integrados a sus servicios personalizados:

 services.AddScoped, ApplicationUserStore>(); services.AddScoped, ApplicationUserManager>(); services.AddScoped, ApplicationRoleManager>(); services.AddScoped, ApplicationSignInManager>(); services.AddScoped, ApplicationRoleStore>(); services.AddScoped(); services.AddScoped(); 

ahora introduce tus servicios personalizados:

 services.AddIdentity(identityOptions => { // ... }).AddUserStore() .AddUserManager() .AddRoleStore() .AddRoleManager() .AddSignInManager() // You **cannot** use .AddEntityFrameworkStores() when you customize everything //.AddEntityFrameworkStores() .AddDefaultTokenProviders();