我正在尝试通过每晚构建ASP.NET Identity 1.1来实现密码重置功能。有一个UserManager.GetPasswordResetToken方法,但它会抛出一个异常“没有注册ITokenProvider”。 ASP.NET身份中是否有内置的令牌提供程序?如果是的话,我怎么注册呢?如果不是,我该如何实施呢?将是1.1中的默认令牌提供程序。发布?最后一个问题,是否有估计的1.1发布日期?
答案 0 :(得分:19)
如果有人在AspNet.Identity 2.0 beta1版本下寻找解决方案。
只需要修改它。
UserManager.UserTokenProvider = new DataProtectorTokenProvider
<SecurityUser, string>(provider.Create("UserToken"))
as IUserTokenProvider<SecurityUser, string>;
PasswordResetTokens
和UserConfirmationTokens
合并到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中初始化UserManagerpublic AccountController() : this(Startup.UserManagerFactory())
{
}
public AccountController(UserManager<IdentityUser> userManager)
{
UserManager = userManager;
}
public UserManager<IdentityUser> UserManager { get; private set; }