Pas de IUserTokenProvider est enregistré

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

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

j'utilise ce" projet 1519130920 " comme référence.

quand l'utilisateur essaie de s'enregistrer, je reçois une erreur lors de l'exécution de la méthode de Post de Registre

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 obtenir erreur disant:

No IUserTokenProvider is registered.

pour l'instant, je voulais juste voir quel genre de code il génère. Y a-t-il un changement que je dois apporter à ma classe ApplicationUser qui hérite de la classe IdentityUser ?

ou y a-t-il quelque chose que je dois changer pour faire fonctionner cette fonction?

85
demandé sur Cybercop 2014-03-25 13:14:18

9 réponses

Vous devez spécifier un UserTokenProvider pour générer un jeton.

using Microsoft.Owin.Security.DataProtection;
using Microsoft.AspNet.Identity.Owin;
// ...

var provider = new DpapiDataProtectionProvider("SampleAppName");

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(
    provider.Create("SampleTokenName"));

vous devriez également lire cet article: ajouter une authentification à deux facteurs à une Application en utilisant ASP.NET identité .

107
répondu meziantou 2018-07-24 14:31:37

en plus de la réponse acceptée, j'aimerais ajouter que cette approche ne fonctionnera pas dans les sites Web Azure, vous obtiendriez CryptographicException au lieu d'un token.

pour le faire réparer pour Azure, implémentez votre propre Idataprotecteur: voir cette réponse

un peu plus de détails dans blog-post

18
répondu trailmax 2017-05-23 11:54:44

In ASP.NET il est maintenant possible de configurer un service par défaut au démarrage.cs:

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

Il n'est pas nécessaire d'appeler la DpapiDataProtectionProvider ou quelque chose comme ça. Le Defaulttokenprovider() se chargera de L'appel à Généreremailconfirmationuntenue du UserManager.

14
répondu pisker 2017-02-23 15:33:52

ma solution:

    var provider = new DpapiDataProtectionProvider("YourAppName");
    UserManager.UserTokenProvider = new DataProtectorTokenProvider<User, string>(provider.Create("UserToken")) 
        as IUserTokenProvider<User, string>;

mon problème avec ce code est résolu.

bonne chance, les amis.

8
répondu Amin Ghaderi 2014-11-12 01:42:16

au cas où quelqu'un ferait la même erreur que moi. J'ai essayé de faire une fonction comme celle ci-dessous et sûr assez l'erreur "No IUserTokenProvider est enregistré."a disparu. Cependant dès que j'ai essayé d'utiliser le lien généré à partir de "callbackUrl" j'ai eu l'erreur "Invalid token."Pour que cela fonctionne, vous devez obtenir le Gestionnaire D'utilisateurs HttpContext. Si vous utilisez une norme ASP.NET MVC 5 application avec des comptes d'utilisateur individuels vous pouvez le faire comme ci-dessous..

Code qui fonctionne:

public ActionResult Index()
     {
         //Code to create ResetPassword URL
         var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
         var user = userManager.FindByName("useremail@gmail.com");
         string code = userManager.GeneratePasswordResetToken(user.Id);
         var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
         return View();
     }

premier essai qui ne fonctionne pas, No IUserTokenProvider is registered. est parti mais L'URL créée obtient Invalid token. .

public ActionResult NotWorkingCode()
     {
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
             var provider = new DpapiDataProtectionProvider("ApplicationName");
             var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
             userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("ASP.NET Identity"));
             var user = userManager.FindByName("useremail@gmail.com");
             string code = userManager.GeneratePasswordResetToken(user.Id);
             var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
         return View();
     }
5
répondu Ogglas 2017-11-27 14:27:15

selon pisker ci-dessus

au démarrage.cs vous pouvez utiliser

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

dans .net core 2.0 vous pouvez avoir besoin d'ajouter au démarrage.cs:

using Microsoft.AspNetCore.Identity;

ça a bien marché pour moi.

3
répondu ScottC 2017-08-22 14:48:38

vous pouvez aussi être intrigué en regardant ici:

comment mettre en œuvre un TokenProvider dans ASP.NET identité 1.1 construction nocturne?

pour utiliser L'implémentation de fournisseur de token par défaut de Microsoft.Identité.Paquet Owin

0
répondu botang 2014-12-11 09:31:04

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 sujet d'interrogation sur la solution: Enregistrer IAuthenticationManager avec l'Unité

également ci-dessous pour consultation rapide:

voici ce que j'ai fait pour rendre L'Unité agréable avec ASP.NET identité 2.0:

j'ai ajouté ce qui suit au RegisterTypes méthode de la classe UnityConfig :

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());
0
répondu Rob 2017-05-23 11:54:44

in IdentityConfig.cs, ajouter votre option twofactor:

        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"));
        }
0
répondu Mohammad Reza Mrg 2018-07-28 10:17:05