Comment implémenter un TokenProvider dans une génération nocturne d’ASP.NET Identity 1.1?

J’essaie d’implémenter la fonctionnalité de réinitialisation de mot de passe avec la version nocturne de ASP.NET Identity 1.1. Il existe une méthode UserManager.GetPasswordResetToken, mais elle génère une exception “Aucun ITokenProvider n’est enregistré”. Existe-t-il un fournisseur de jeton intégré dans ASP.NET Identity? Si oui, comment puis-je l’enregistrer? Si non, comment puis-je en implémenter un? Sera le fournisseur de jetons par défaut dans la 1.1. Libération? Et dernière question, y a-t-il une date de sortie estimée à 1.1?

L’implémentation du fournisseur de jetons par défaut se trouve dans le package Microsoft.Identity.Owin :

 ///  /// Token provider that uses a DataProtector to generate encrypted tokens ///  public class DataProtectorTokenProvider : ITokenProvider { public DataProtectorTokenProvider(IDataProtector protector) 

Et vous faites quelque chose comme ceci pour en câbler un en utilisant le fournisseur de protection des données par défaut de votre OWIN IAppBuilder

 IDataProtectionProvider provider = app.GetDataProtectionProvider(); if (provider != null) { manager.PasswordResetTokens = new DataProtectorTokenProvider(provider.Create("PasswordReset")); manager.UserConfirmationTokens = new DataProtectorTokenProvider(provider.Create("ConfirmUser")); } 

Si quelqu’un cherche une solution sous AspNet.Identity 2.0 version beta1.

Seulement cela doit être modifié.

 UserManager.UserTokenProvider = new DataProtectorTokenProvider (provider.Create("UserToken")) as IUserTokenProvider; 

PasswordResetTokens et UserConfirmationTokens sont fusionnés dans la propriété UserTokenProvider et la classe du fournisseur de jetons est également modifiée.

Une autre façon de faire cela (en s’appuyant sur les autres réponses mais en simplifiant certaines) est de changer Startup.Auth.cs pour qu’il ressemble à ceci:

 public partial class Startup { internal static IDataProtectionProvider DataProtectionProvider { get; private set; } public void ConfigureAuth(IAppBuilder app) { DataProtectionProvider = app.GetDataProtectionProvider(); } } 

Ensuite, modifiez le constructeur par défaut dans AccountController.cs afin qu’il ressemble à ceci:

  public AccountController() : this(new UserManager(new UserStore(new ApplicationDbContext()))) { if (Startup.DataProtectionProvider != null) { this.UserManager.PasswordResetTokens = new DataProtectorTokenProvider(Startup.DataProtectionProvider.Create("PasswordReset")); this.UserManager.UserConfirmationTokens = new DataProtectorTokenProvider(Startup.DataProtectionProvider.Create("ConfirmUser")); } } 

Ok, répondez à ma propre question basée sur la réponse de @ hao-kung. Ajoutez d’abord le constructeur statique et UserManagerFactory à la classe Statrup (startup.auth.cs)

 public partial class Startup { static Startup() { UserManagerFactory = () => new UserManager(new UserStore()); } public static Func> UserManagerFactory { get; set; } public void ConfigureAuth(IAppBuilder app) { var manager = UserManagerFactory(); IDataProtectionProvider provider = app.GetDataProtectionProvider(); if (provider != null) { manager.PasswordResetTokens = new DataProtectorTokenProvider(provider.Create("PasswordReset")); manager.UserConfirmationTokens = new DataProtectorTokenProvider(provider.Create("ConfirmUser")); } app.UseCookieAuthentication(new CookieAuthenticationOptions()); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); } } 

Ensuite, initiez UserManager dans AccountController en utilisant cette UserManagerFactory.

 public AccountController() : this(Startup.UserManagerFactory()) { } public AccountController(UserManager userManager) { UserManager = userManager; } public UserManager UserManager { get; private set; }