Можно ли установить машинный ключ для рабочей роли Azure

Я разместил сервер Owin WebAPI в рабочей роли Azure.
Промежуточное программное обеспечение Autin Authentication использует MachineKey для шифрования и генерации токенов. Это прекрасно работает, когда у меня есть только один экземпляр этой роли, но как только я захочу использовать несколько экземпляров, токены, генерируемые каждым экземпляром, будут разными.

Это та же проблема, что и для веб-фермы. Azure автоматически решает эту проблему для веб-ролей, используя один и тот же ключ машины.net для всех экземпляров в Web.config.

Но это не работает для экземпляров Worker Role.

Есть ли хитрость в том, чтобы Azure использовал один и тот же ключ компьютера для всех экземпляров рабочей роли?

Кажется, было бы проще, чем переписывать код, чтобы генерировать токены для Овина.

1 ответ

Если ваше самостоятельное приложение может ссылаться System.Web, то вы можете использовать ту же реализацию MachineKey, что и Microsoft.Owin.Host.SystemWeb делает.

Положить configuration/system.web/machineKey Настройки в вашем App.config так же, как в Web.config.

Справочная ссылка System.Web и добавьте следующий класс:

public class MachineKeyDataProtector : IDataProtector
{
    private readonly string[] purposes;

    public MachineKeyDataProtector(params string[] purposes)
    {
        this.purposes = purposes;
    }

    public byte[] Protect(byte[] userData)
    {
        return MachineKey.Protect(userData, this.purposes);
    }

    public byte[] Unprotect(byte[] protectedData)
    {
        return MachineKey.Unprotect(protectedData, this.purposes);
    }
}

Затем установите параметры аутентификации, используя этот класс:

        var authenticationOptions = new OAuthBearerAuthenticationOptions
                                    {
                                        AccessTokenFormat = new TicketDataFormat(new MachineKeyDataProtector(
                                            typeof(OAuthBearerAuthenticationMiddleware).Namespace, "Access_Token", "v1")),
                                        AccessTokenProvider = new AuthenticationTokenProvider(),
                                    };
Другие вопросы по тегам