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



我需要一个IDataProtectionProvider的实例,以便在Azure Web Jobs工作程序中使用Identity Framework UserManager生成电子邮件确认令牌:

var confirmToken = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

这会崩溃,因为在构造时向UserManager<User, int>传递了一个空IUserTokenProvider<User, int>

在MVC应用程序中,一个实例是这样创建的:

public class OWINStartup
{
    public void Configuration(IAppBuilder app)
    {
        var dataProtectionProvider = app.GetDataProtectionProvider();

当然,Azure Web Jobs没有OWINStartup挂钩。有什么建议吗?

查看OWIN启动上下文的Katana源代码,可以看到DataProtectionProvider的默认实现是MachineKeyDataProtectionProvider。不幸的是,这个类没有向我们公开,只有DpapiDataProtectionProvider,它在azure中托管时不起作用。

您可以在这里找到MachineKeyDataProtectionProvider的实现。您还需要实现自己的MachineKeyDataProtector,如图所示。这些并不难实现,本质上是MachineKey.Protect()MachineKey.Unprotect()的包装。

来自Katana项目源(apache2.0许可证)的MachineKeyDataProtectionProviderMachineKeyDataProtector的实现:

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"));

希望这能帮助你朝着正确的方向前进。

相关内容

  • 没有找到相关文章

最新更新