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