J'obtiens cette erreur dans le contrôleur de connexion.
InvalidOperationException: impossible de résoudre le service pour le type «Microsoft.AspNetCore.Identity.UserManager» 1 [Automobile.Models.Account] »lors de la tentative d'activation de« Automobile.Server.Controllers.AuthController ».
voici le constructeur Auth Controller:
private SignInManager<Automobile.Models.Account> _signManager;
private UserManager<Automobile.Models.Account> _userManager;
public AuthController(UserManager<Models.Account> userManager,
SignInManager<Automobile.Models.Account> signManager)
{
this._userManager = userManager;
this._signManager = signManager;
}
et voici ConfigureServices dans startup.cs:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.Configure<AppConfig>(Configuration.GetSection("AppSettings"));
//var provider = HttpContext.ApplicationServices;
//var someService = provider.GetService(typeof(ISomeService));
services.AddDbContext<Providers.Database.EFProvider.DataContext>(options => options
.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
b => b.MigrationsAssembly("Automobile.Server")
));
services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
.AddDefaultTokenProviders();
//services.AddScoped<SignInManager<Automobile.Models.Account>, SignInManager<Automobile.Models.Account>>();
//services.AddScoped<UserManager<Automobile.Models.Account>, UserManager<Automobile.Models.Account>>();
services.AddMvc();
App.Service = services.BuildServiceProvider();
// Adds a default in-memory implementation of IDistributedCache.
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.CookieHttpOnly = true;
});
}
IdentityUser
tant que classe d'utilisateurs de base, mais que vous utilisezAutomobile.Models.Account
ce qui, bien sûr, n'est enregistré nulle part par ASP.NET IdentityRéponses:
Vous devez utiliser le même modèle de données utilisateur dans SignInManager, UserManager et services.AddIdentity. Le même principe est vrai si vous utilisez votre propre classe de modèle de rôle d'application personnalisée.
Alors, changez
services.AddIdentity<IdentityUser, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
à
services.AddIdentity<Automobile.Models.Account, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
la source
Juste pour être clair sur la réponse:
Si vous utilisez la classe
ApplicationUser
dans startup.cs:services.AddIdentity<ApplicationUser, IdentityRole>()
alors vous devez utiliser la même classe dans votre contrôleur lors de son injection:
public AccountController(UserManager<ApplicationUser> userManager)
Si vous utilisez une autre classe telle que:
public AccountController(UserManager<IdentityUser> userManager)
alors vous obtiendrez cette erreur:
car vous avez utilisé
ApplicationUser
au démarrage, pasIdentityUser
si ce type n'est pas enregistré avec le système d'injection.la source
C'est un peu sans rapport avec le message d'origine, mais puisque Google vous amène ici ... si vous obtenez cette erreur et que vous utilisez:
Ensuite, vous devrez enregistrer manuellement ce qui le
AddIdentity
fait, qui peut être trouvé ici: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79services.AddHttpContextAccessor(); // Identity services services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>(); services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>(); services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>(); services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>(); services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>(); // No interface for the error describer so we can add errors without rev'ing the interface services.TryAddScoped<IdentityErrorDescriber>(); services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>(); services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>(); services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>(); services.TryAddScoped<UserManager<TUser>>(); services.TryAddScoped<SignInManager<TUser>>(); services.TryAddScoped<RoleManager<TRole>>();
Vous devrez remplacer
TUser
etTRole
avec vos implémentations de ceux-ci, ou la valeur par défautIdentityUser
,IdentityRole
la source
AddIdentity
et aAddJwtBearer
été de définir les trois options indiquées dans l'exemple; je n'utilisais queDefaultAuthenticationScheme
. Je récupère toujours le cookie à la connexion, mais[Authorize]
fonctionne maintenant pour les jetons JWT sans spécifier de AuthenticationSchema.n'oubliez pas d'ajouter un gestionnaire de rôles dans ConfigureServices
services.AddDefaultIdentity<IdentityUser>() .AddRoles<IdentityRole>() // <-------- .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>();
la source
Vous pouvez définir individuellement IdentityUser et IdentityRole dans ConfigureServices à l'intérieur de la classe Startup, comme indiqué ci-dessous:
OU
vous pouvez configurer directement dans AddIdentity:
la source
Si vous utilisez "IdentityServer", IdentityServer authentifie l'utilisateur et autorise le client. Par défaut, IdentityServer ne concerne pas la gestion des utilisateurs. Mais il existe un support pour asp.net Identity
Vous devez donc ajouter:
la source
Vous devez mettre à jour votre classe Statup.cs avec ci-dessous
services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();
Ici: ApplicationUser est ma classe de modèle personnalisé.
la source