8

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

4

4 回答 4

19

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

只有这个需要修改。

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

PasswordResetTokens并被UserConfirmationTokens合并到UserTokenProvider属性和令牌提供者类也被修改。

于 2014-02-14T10:16:54.407 回答
7

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"));
}
于 2013-10-23T18:04:00.547 回答
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"));
     }
 }
于 2013-10-26T18:09:17.280 回答
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; }
于 2013-10-24T13:35:06.413 回答