我需要一个IDataProtectionProvider的实例来生成使用Azure Web Jobs工作中的Identity Framework UserManager的电子邮件确认令牌:
var confirmToken = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
这是因为null IUserTokenProvider< User,int>被传递给UserManager< User,int>建议
在MVC应用程序中,一个实例是这样创建的:
public class OWINStartup { public void Configuration(IAppBuilder app) { var dataProtectionProvider = app.GetDataProtectionProvider();
但是当然,Azure Web Jobs没有OWINStartup钩子.任何建议?
解决方法
看看
OWIN startup context的
Katana源代码,可以看到DataProtectionProvider的默认实现是一个MachineKeyDataProtectionProvider.不幸的是,这个课程不会暴露给我们,只有
DpapiDataProtectionProvider
在
hosted in azure时才会工作.
您可以找到MachineKeyDataProtectionProvider here的实现.您还需要实现您自己的MachineKeyDataProtector,如here所示.这些并不难,并且基本上是MachineKey.Protect()
和MachineKey.Unprotect()
的包装器.
MachineKeyDataProtectionProvider和MachineKeyDataProtector从Katana项目来源(apache 2.0 license)的实现:
internal class MachineKeyProtectionProvider : IDataProtectionProvider { public IDataProtector Create(params string[] purposes) { return new MachineKeyDataProtector(purposes); } } internal class MachineKeyDataProtector : IDataProtector { private readonly string[] _purposes; public MachineKeyDataProtector(string[] purposes) { _purposes = purposes; } public byte[] Protect(byte[] userData) { return MachineKey.Protect(userData,_purposes); } public byte[] Unprotect(byte[] protectedData) { return MachineKey.Unprotect(protectedData,_purposes); } }
一旦实现了它,就很容易插入到UserManager中:
var usermanager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>()); var machineKeyProtectionProvider = new MachineKeyProtectionProvider(); usermanager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(machineKeyProtectionProvider.Create("ASP.NET Identity"));
希望能帮助你走向正确的方向.