109 votes

Aucun IUserTokenProvider n'est enregistré

J'ai récemment mis à jour Asp.Net Identity Core de mon formulaire de candidature 1.0 à 2.0.

Il y a de nouvelles fonctionnalités que je voulais essayer comme GenerateEmailConfirmationToken etc.

J'utilise este comme référence.

Lorsque l'utilisateur essaie de s'enregistrer, j'obtiens une erreur lors de l'exécution de la méthode Post de Register

private readonly UserManager<ApplicationUser> _userManager;     

public ActionResult Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var ifUserEXists = _userManager.FindByName(model.EmailId);
        if (ifUserEXists == null) return View(model);
        var confirmationToken = _userRepository.CreateConfirmationToken();//this is how i'm generating token currently.                
        var result = _userRepository.CreateUser(model,confirmationToken);
        var user = _userManager.FindByName(model.EmailId);
        if (result)
        {
            var code = _userManager.GenerateEmailConfirmationToken(user.Id);//error here
            _userRepository.SendEmailConfirmation(model.EmailId, model.FirstName, confirmationToken);
            //Information("An email is sent to your email address. Please follow the link to activate your account.");
            return View("~/Views/Account/Thank_You_For_Registering.cshtml");
        }     
    }

    //Error("Sorry! email address already exists. Please try again with different email id.");
    ModelState.AddModelError(string.Empty, Resource.AccountController_Register_Sorry__User_already_exists__please_try_again_);
    return View(model);
}

Dans la ligne

 var code = _userManager.GenerateEmailConfirmationToken(user.Id);

Je reçois une erreur disant :

No IUserTokenProvider is registered.

Pour l'instant, je voulais juste voir quel genre de code il génère. Est-ce que je dois modifier mon ApplicationUser qui hérite de IdentityUser classe ?

Ou dois-je modifier quelque chose pour que ces fonctions fonctionnent ?

1 votes

Y a-t-il un moyen de vérifier si un utilisateur existe en se basant sur d'autres champs que l'adresse électronique ? Par exemple, si j'avais deux champs appelés Numéro de client et Code postal pour les utilisateurs qui existeraient déjà dans la base de données afin d'empêcher n'importe qui de s'inscrire

6voto

ScottC Points 406

Comme pour pisker ci-dessus

Dans le fichier startup.cs, vous pouvez utiliser

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();

Dans .net core 2.0, vous devrez peut-être ajouter au fichier startup.cs :

using Microsoft.AspNetCore.Identity;

Cela a bien fonctionné pour moi.

6voto

Yawar Ali Points 11

En modifiant les fichiers Identity de .NET Core, je suis tombé sur cette erreur :

NotSupportedException : Aucun IUserTwoFactorTokenProvider nommé. 'Default' n'est enregistré.

El

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

n'a pas pu générer un jeton car aucun fournisseur n'était disponible lors de l'enregistrement d'un nouvel utilisateur. Cette erreur peut être corrigée facilement !

Si vous êtes comme moi, vous avez changé AddDefaultIdentity dans le Startup.cs pour AddIdentity . Je voulais implémenter mon propre utilisateur qui hérite de l'utilisateur de base. En faisant cela, j'ai perdu les fournisseurs de jetons par défaut. La solution a été de les rajouter avec AddDefaultTokenProviders() .

        services.AddIdentity<User, UserRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

Après cette réparation, tout a fonctionné à nouveau !

source : https://mattferderer.com/NotSupportedException-No-IUserTwoFactorTokenProvider-tuser-named-default-registered

1voto

Rob Points 376

J'ai eu la même erreur après avoir mis à jour l'identité, et j'ai découvert que c'était parce que j'utilisais Unity.

Voir ce fil de questions sur la solution : Enregistrer IAuthenticationManager avec Unity

Également ci-dessous pour une référence rapide :

Voici ce que j'ai fait pour que Unity soit compatible avec ASP.NET Identity 2.0 :

J'ai ajouté les éléments suivants à la RegisterTypes dans le UnityConfig classe :

container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<AccountController>(new InjectionConstructor());

0voto

botang Points 89

Vous pourriez également être intéressé par ce site :
Comment mettre en œuvre un TokenProvider dans ASP.NET Identity 1.1 nightly build ?
pour utiliser l'implémentation du fournisseur de jetons par défaut du paquet Microsoft.Identity.Owin

0voto

Dans IdentityConfig.cs, ajoutez votre option de double facteur :

        manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is {0}"
        });
        //config sms service 
        manager.SmsService = new Services.SMS();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X