如何在ASP.NET Identity 1.1中每晚构建一个TokenProvider?

我正在尝试使用ASP.NET Identity 1.1的每晚构建实现密码重置function。 有一个UserManager.GetPasswordResetToken方法,但它会抛出exception“没有注册ITokenProvider”。 ASP.NET身份中是否有内置的令牌提供程序? 如果是,我如何注册? 如果不是,我该如何实施呢? 将是1.1中的默认令牌提供程序。 发布? 最后一个问题,是否有估计的1.1发布日期?

可以在Microsoft.Identity.Owin包中找到默认令牌提供程序实现:

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

你可以使用OWIN IAppBuilder的默认数据保护提供程序连接一个这样的东西

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

如果有人在AspNet.Identity 2.0 beta1版本下寻找解决方案。

只有这一点需要修改。

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

PasswordResetTokensUserConfirmationTokens合并到UserTokenProvider属性中,并且还修改了令牌提供程序类。

另一种方法(基于其他答案,但简化一些)是改变Startup.Auth.cs所以它看起来像这样:

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

然后,修改AccountController.cs的默认构造函数,使其看起来类似于:

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

好的,根据@ hao-kung的回复回答我自己的问题。 首先将静态构造函数和UserManagerFactory添加到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); } } 

然后使用该UserManagerFactory在AccountController中初始化UserManager

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