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

j'essaie de mettre en œuvre la fonctionnalité de réinitialisation de mot de passe avec la construction nocturne de ASP.NET identité 1.1. Il y a un UserManager.Getpasswordresettoken méthode, mais il jette une exception "No ITokenProvider is registered". Y a - t-il un fournisseur de tokens intégré dans ASP.NET identité? Si oui, comment je peux l'enregistrer? Si non, Comment puis-je en mettre une en œuvre? Sera le fournisseur de Token par défaut dans le 1.1. à la libération? Question finale: y a-t-il une date de sortie estimée à 1,1 heure?

7
demandé sur graycrow 2013-10-23 14:48:09

4 réponses

l'implémentation par défaut de token provider se trouve dans le paquet Microsoft.Identity.Owin :

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

et vous faites quelque chose comme ça pour en brancher 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"));
}
6
répondu Hao Kung 2016-03-12 18:18:48

si quelqu'un cherche une solution sous AspNet.Identité 2.0 version beta1.

uniquement ceci doit être modifié.

UserManager.UserTokenProvider = new DataProtectorTokenProvider
<SecurityUser, string>(provider.Create("UserToken")) 
as IUserTokenProvider<SecurityUser, string>;

PasswordResetTokens et UserConfirmationTokens est fusionné en UserTokenProvider propriété et la classe de fournisseur de token est également modifiée.

19
répondu Vikash Kumar 2014-02-14 10:16:54

une autre façon de faire ceci (en s'appuyant sur les autres réponses mais en les simplifiant un peu) est de changer Startup.Auth.cs de sorte qu'il ressemble à ceci:

public partial class Startup
{
    internal static IDataProtectionProvider DataProtectionProvider { get; private set; }

    public void ConfigureAuth(IAppBuilder app)
    {
        DataProtectionProvider = app.GetDataProtectionProvider();
    }
}

puis, modifier le constructeur par défaut dans AccountController.cs pour qu'il ressemble à ceci:

 public AccountController()
     : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
 {
     if (Startup.DataProtectionProvider != null)
     {
         this.UserManager.PasswordResetTokens = new DataProtectorTokenProvider(Startup.DataProtectionProvider.Create("PasswordReset"));
         this.UserManager.UserConfirmationTokens = new DataProtectorTokenProvider(Startup.DataProtectionProvider.Create("ConfirmUser"));
     }
 }
5
répondu Scott Dorman 2013-10-26 18:09:17

Ok, répondre à ma propre question sur la base de la réponse de @hao-kung. D'abord ajouter le constructeur statique et UserManagerFactory à la classe Statrup (startup.auth.cs)

public partial class Startup
{
    static Startup()
    {
        UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
    }

    public static Func<UserManager<IdentityUser>> 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);
    }
}

puis init UserManager dans le AccountController en utilisant ce UserManagerFactory

public AccountController() : this(Startup.UserManagerFactory())
{
}

public AccountController(UserManager<IdentityUser> userManager)
{
    UserManager = userManager;
}

public UserManager<IdentityUser> UserManager { get; private set; }
1
répondu graycrow 2013-10-24 13:35:06