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?
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é .
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
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.
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.
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();
}
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.
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
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 classeUnityConfig
: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());
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"));
}