tutorial tables net framework español asp c# asp.net asp.net-identity-2

tables - roles asp.net c#



No IUserTokenProvider está registrado (8)

Además de la respuesta aceptada, me gustaría añadir que este enfoque no funcionará en los sitios web de Azure, que obtendría CryptographicException en lugar de un token.

Para solucionarlo en Azure, implemente su propio IDataProtector: vea esta respuesta

Un poco más de detalle en la blog-post

Recientemente, actualicé Asp.Net Identity Core de mi formulario de solicitud 1.0 a 2.0.

Hay nuevas funciones que quería probar, como GenerateEmailConfirmationToken , etc.

Estoy usando this proyecto como referencia.

Cuando el usuario intenta registrarse, obtengo un error durante la ejecución del método Post de Registro

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

En la linea

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

Me sale un error diciendo:

No IUserTokenProvider is registered.

Por ahora, solo quería ver qué tipo de código genera. ¿Hay algún cambio que deba hacer en mi clase ApplicationUser que hereda de la clase IdentityUser ?

¿O hay algo que necesito cambiar para que funcionen?


En ASP.NET Core, hoy en día es posible configurar un servicio predeterminado en Startup.cs como este:

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

No es necesario llamar al DpapiDataProtectionProvider ni nada de eso. Los DefaultTokenProviders () se encargarán de la llamada a GenerateEmailConfirmationToken desde el UserManager.


En caso de que alguien más cometa el mismo error que yo hice. Intenté hacer una función como la siguiente y, por supuesto, el error "No IUserTokenProvider está registrado". se había ido. Sin embargo, tan pronto como traté de utilizar el enlace generado desde "callbackUrl" recibí el error "Token inválido". Para que funcione, debe obtener el UserManager HttpContext. Si está utilizando una aplicación ASP.NET MVC 5 estándar con cuentas de usuario individuales, puede hacerlo como se muestra a continuación.

Código que funciona:

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

Primero intente que no funcione, No IUserTokenProvider is registered. se ha ido, pero la URL creada obtiene el 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("[email protected]"); 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(); }


Recibí el mismo error después de actualizar Identity, y descubrí que era porque estaba usando Unity.

Vea este hilo de pregunta en la solución: Registre IAuthenticationManager con Unity

También a continuación para una referencia rápida:

Esto es lo que hice para hacer que Unity juegue bien con ASP.NET Identity 2.0:

UnityConfig siguiente al método RegisterTypes en la clase 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());


Según pisker arriba

En startup.cs puedes usar

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

En .net core 2.0, puede que necesites agregar a startup.cs:

using Microsoft.AspNetCore.Identity;

Esto funcionó bien para mi.



UserTokenProvider especificar un UserTokenProvider para generar un token.

using Microsoft.Owin.Security.DataProtection; using Microsoft.AspNet.Identity.Owin; // ... var provider = new DpapiDataProtectionProvider("Sample"); var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>()); userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>( provider.Create("EmailConfirmation"));

También debería leer este artículo: Agregar Autenticación de Dos Factores a una Aplicación que Usa Identidad ASP.NET .


Mi solución :

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

Mi problema con este código resuelto.
Buena suerte amigos.