Подтвердить что ты не робот

Как я могу создать экземпляр OWIN IDataProtectionProvider в Azure Web Jobs?

Мне нужен экземпляр IDataProtectionProvider для создания токенов подтверждения электронной почты с использованием Identity Framework UserManager в рабочем приложении Azure Web Jobs:

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. Любые советы?

4b9b3361

Ответ 1

Взглянув на Katana исходный код контекста запуска OWIN, вы можете увидеть реализация по умолчанию DataProtectionProvider - это MachineKeyDataProtectionProvider. К сожалению, этот класс не доступен для нас, только DpapiDataProtectionProvider, который не будет работать, когда размещен в лазурном виде..

Здесь вы можете найти реализацию MachineKeyDataProtectionProvider . Вам также нужно будет реализовать свой собственный MachineKeyDataProtector, как показано здесь. Это не сложное внедрение и по существу обертывание вокруг 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"));

Надеюсь, что это поможет вам в правильном направлении.