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

时间:2013-10-23 10:48:10

标签: c# asp.net asp.net-mvc-5 asp.net-identity

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

4 个答案:

答案 0 :(得分:19)

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

只需要修改它。

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

PasswordResetTokensUserConfirmationTokens合并到UserTokenProvider属性中,令牌提供程序类也会被修改。

答案 1 :(得分:6)

默认令牌提供程序实现位于Microsoft.Identity.Owin包中:

/// <summary>
/// Token provider that uses a DataProtector to generate encrypted tokens
/// </summary>
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"));
}

答案 2 :(得分:5)

另一种方法(基于其他答案,但简化一些)是改变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<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"));
     }
 }

答案 3 :(得分:1)

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

然后使用该UserManagerFactory

在AccountController中初始化UserManager
public AccountController() : this(Startup.UserManagerFactory())
{
}

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

public UserManager<IdentityUser> UserManager { get; private set; }