如何在Azure Web作业中实例化OWIN IDataProtectionProvider?

前端之家收集整理的这篇文章主要介绍了如何在Azure Web作业中实例化OWIN IDataProtectionProvider?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一个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 contextKatana代码,可以看到DataProtectionProvider的默认实现是一个MachineKeyDataProtectionProvider.不幸的是,这个课程不会暴露给我们,只有 DpapiDataProtectionProviderhosted 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"));

希望能帮助你走向正确的方向.

猜你在找的HTML相关文章