J'ai une base de données d'identités principale asp.net plus ancienne et je souhaite y mapper un nouveau projet (une API).
Juste pour le test, j'ai copié le dossier Models et le fichier ApplicationUser du projet précédent (ApplicationUser hérite simplement d'IdentityUser, aucune modification ne sera apportée). Faire une base de données semble être une mauvaise idée.
J'enregistre Identity dans ConfigureServices (mais je ne l'ajoute pas au pipeline car mon seul but est d'utiliser UserStore)
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Mon attente est que maintenant
UserManager<ApplicationUser>
... devrait être automatiquement injecté dans les constructeurs.
Cependant, lors de l'ajout du code suivant à un contrôleur private UserManager _userManager;
public UserController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
... chaque appel à l'API se termine par une exception: HttpRequestException: le code d'état de la réponse n'indique pas le succès: 500 (erreur de serveur interne).
La suppression du code "d'injection" permet à l'API Web de fonctionner correctement et d'accepter les demandes.
Il est difficile de déboguer car cela se produit avant qu'aucun de mes codes ne soit atteint. Une idée pourquoi cela se produit?
P.S. Après avoir activé toutes les exceptions à partir de la fenêtre des paramètres d'exception, voici celui-ci:
Exception levée: 'System.InvalidOperationException' dans
Microsoft.Extensions.DependencyInjection.dllInformations complémentaires: Impossible de résoudre le service pour le type 'Namespace.Data.ApplicationDbContext' lors de la tentative d'activation de 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [Namespace.Models . ApplicationUser, Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole, Namespace.Data.ApplicationDbContext, System.String] '.
Avez-vous l'appel app.UseIdentity();
dans la méthode Configure
:
public void Configure(IApplicationBuilder app,
IHostingEnvironment env, ILoggerFactory loggerFactory)
{
/*...*/
app.UseIdentity();
/*...*/
}
MODIFIER Avez-vous également cette ligne avant la ligne services.AddIdentity<ApplicationUser, IdentityRole>()
?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
Cela devrait fonctionner correctement. Vérifiez également si ApplicationDbContext
hérite de IdentityDbContext
.
Le conteneur DI est incapable de résoudre une dépendance. Ajoutez-le à la collection de services
services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();
Vous devez également vous familiariser avec le documentation officielle
public void ConfigureServices(IServiceCollection services){
...
var identityBuilder = services.AddIdentityCore<ApplicationUser>(user =>
{
// configure identity options
user.Password.RequireDigit = true;
user.Password.RequireLowercase = false;
user.Password.RequireUppercase = false;
user.Password.RequireNonAlphanumeric = false;
user.Password.RequiredLength = 6;
});
identityBuilder = new IdentityBuilder(identityBuilder.UserType, typeof(IdentityRole), identityBuilder.Services);
identityBuilder.AddEntityFrameworkStores<DbContext>().AddDefaultTokenProviders();
...
}