1
votes

Comment puis-je injecter une dépendance SignInManager?

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?


0 commentaires

4 Réponses :


1
votes

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>();


2 commentaires

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



1
votes

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>()


0 commentaires

2
votes

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 le UserManager uniquement sans SignInManager

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>

0 commentaires

1
votes

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


0 commentaires