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

时间:2015-02-19 12:39:50

标签: azure asp.net-identity owin azure-webjobs

我需要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挂钩。有什么建议吗?

1 个答案:

答案 0 :(得分:17)

查看KatanaOWIN startup context源代码,您可以看到DataProtectionProvider的默认实现是MachineKeyDataProtectionProvider。不幸的是,这个课程没有向我们公开,只有DpapiDataProtectionProviderhosted in azure时无效。

您可以找到MachineKeyDataProtectionProvider here的实施。您还需要实现自己的MachineKeyDataProtector here。这些并非难以实现,基本上是围绕MachineKey.Protect()MachineKey.Unprotect()的包装。

来自Katana项目来源(apache 2.0 license)的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"));

希望这有助于您找到正确的方向。