我需要IDataProtectionProvider
的实例来使用Azure Web Jobs工作者中的Identity Framework UserManager
生成电子邮件确认令牌:
var confirmToken = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
由于在构建时将IUserTokenProvider<User, int>
传递给UserManager<User, int>
,因此崩溃了。
在MVC应用程序中,创建一个如下实例:
public class OWINStartup
{
public void Configuration(IAppBuilder app)
{
var dataProtectionProvider = app.GetDataProtectionProvider();
但是,当然,Azure Web Jobs没有OWINStartup
挂钩。有什么建议吗?
答案 0 :(得分:17)
查看Katana的OWIN startup context源代码,您可以看到DataProtectionProvider
的默认实现是MachineKeyDataProtectionProvider
。不幸的是,这个课程没有向我们公开,只有DpapiDataProtectionProvider
在hosted in azure时无效。
您可以找到MachineKeyDataProtectionProvider
here的实施。您还需要实现自己的MachineKeyDataProtector
here。这些并非难以实现,基本上是围绕MachineKey.Protect()
和MachineKey.Unprotect()
的包装。
来自Katana项目来源(apache 2.0 license)的MachineKeyDataProtectionProvider
和MachineKeyDataProtector
的实施:
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"));
希望这有助于您找到正确的方向。