我正在使用ASP.NET Identity 2.0。
在我的业务层(一个单独的DLL)中,我使用UserManager执行CreateUser或DeleteUser等简单任务。
protected UserManager<User> UserManager
{
get
{
if (_userManager == null)
{
_userManager = new UserManager<User>(UserStore);
}
_userManager.UserValidator = new UserValidator<User>(_userManager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
return _userManager;
}
}
到目前为止,一切都很好。
现在我想生成电子邮件确认令牌:
public string GenerateEmailConfirmationToken(User user)
{
if (user == null)
return null;
return UserManager.GenerateEmailConfirmationToken(user.Id);
}
上述代码在运行时失败,因为我的UserManager缺少DataProtectionProvider。
我的问题:我不知道如何将DataProtectionProvider添加到我的UserManager。
在MVC Web项目中,这是一项简单的任务(代码取自IdentityConfig.cs):
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<User>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<User>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<User>(dataProtectionProvider.Create("semperplus"));
}
return manager;
}
但我的业务逻辑中的UserManger不知道我的Web项目中的UserManager。我想我可以将我的web项目的UserManager传递给我的业务层,但我也有其他一些客户端项目(它们不是基于Web的)。所以,我宁愿采用另一种方式:在业务层中创建一个UserManager,让所有其他项目使用这个。
有人知道如何在我的业务层项目中创建DataProtectionProvider吗?