J'ai une application WebAPI sur laquelle j'utilise un authentificateur tiers (authentification Firebase).
L'authentification fonctionne mais une fois que l'utilisateur s'est connecté à mon serveur, je souhaite enregistrer les informations d'identification et les données utilisateur dans mes tables d'identité ASP.NET.
Il semble que je puisse utiliser le UserManager pour créer des comptes si j'appelle cette ligne dans mon fichier Startup.cs
public ValuesController(SignInManager<ApplicationUser> signInManager)
Cela me permet d'ajouter UserManager dans mon constructeur sans ajouter toutes les pages de connexion et le schéma d'authentification par cookie par défaut que j'obtiendrais normalement si j'appelais AddIdentity ()
Cependant, lorsque j'ajoute SignInManager dans mon constructeur comme celui-ci
services.AddIdentityCore<ApplicationUser>() .AddEntityFrameworkStores<ApplicationDbContext>();
Il semble que je reçoive toujours cette erreur.
Une exception non gérée s'est produite lors de l'exécution de la requête. System.InvalidOperationException: impossible de résoudre le service pour le type "Microsoft.AspNetCore.Identity.SignInManager`1 [mvcWithAuth.Data.ApplicationUser]" en essayant d'activer 'testWebAPIFB.Controllers.ValuesController'.
Cela semble signifier qu'AddIdentityCore n'ajoute pas SignInManager. Comment ajouter SignInManager en tant que classe à injecter une dépendance?
4 Réponses :
SignInManager est enregistré auprès de AddIdentity
. AddIdentityCore
enregistrez uniquement UserManger.
dans votre code utilisez,
services.AddDbContext<ApplicationDbContext>(/*options => Db Config*/); services.AddIdentity<ApplicationUser>(cfg => { cfg.Password.RequireDigit = true; cfg.Password.RequiredLength = 8; cfg.Password.RequireNonAlphanumeric = false; cfg.Password.RequireUppercase = false; cfg.Password.RequireLowercase = true; cfg.User.RequireUniqueEmail = true; }) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddAuthentication(cfg => { cfg.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; cfg.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(cfg => { cfg.RequireHttpsMetadata = false; cfg.SaveToken = true; cfg.TokenValidationParameters = new TokenValidationParameters() { ValidIssuer = Configuration["Tokens:Issuer"], ValidAudience = Configuration["Tokens:Issuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])) }; });
Edit: Pour faire de JWTBearer comme schéma d'authentification par défaut, voici ce que j'ai fait ,
services.AddIdentity<ApplicationUser>() .AddEntityFrameworkStores<ApplicationDbContext>();
donc le seul problème est que AddIdentity remplace le schéma d'authentification par défaut pour l'authentification par cookie et j'utilise des jetons JWT pour m'authentifier. Alors j'obtiens juste une erreur d'authentification et me redirige vers la page Compte / Connexion.
Pour cela, vous pouvez définir le schéma d'authentification par défaut sur JWT
Vous devez utiliser AddIdentity car le SignInManager n'est pas enregistré dans DI Container
comme
services.TryAddScoped<SignInManager<ApplicationUser>>();
ou
Enregistrez le SignInManager
services.AddIdentity<ApplicationUser>() .AddEntityFrameworkStores<ApplicationDbContext>()
Cela semble signifier qu'AddIdentityCore n'ajoute pas SignInManager.
C'est vrai.Si vous vérifiez le code source de Addidentity et AddIdent trouvera que
AddIdentityCore
enregistre leUserManager
uniquement sansSignInManager
Pour ajouter
SignInManager
avec AddIdentityCore , vous pouvez essayer:IdentityBuilder builder = services.AddIdentityCore<ApplicationUser>(); builder = new IdentityBuilder(builder.UserType, builder.Services); builder.AddEntityFrameworkStores<ApplicationDbContext>(); builder.AddSignInManager<SignInManager<ApplicationUser>>();Reportez-vous à . Net Core 2.0 Web API using JWT - L'ajout d'identité rompt l'authentification JWT
blockquote>
L'utilisation de ce code fonctionnera pour vous.
Dans votre contrôleur
services .AddIdentity<User, ApplicationRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();
Dans votre Startup.cs
private readonly SignInManager<User> _signInManager; public SomeController( SignInManager<User> signInManager) { _signInManager = signInManager; }