是否可以为Azure辅助角色设置机器密钥

时间:2014-01-09 18:50:25

标签: azure azure-worker-roles machinekey

我在Azure辅助角色中托管了一个Owin WebAPI服务器 Owin Authentication中间件似乎使用MachineKey来加密和生成令牌。 当我只有一个这个角色的实例时,这很有效,但是一旦我想使用多个实例,每个实例生成的标记就是不同的。

这与Web场相同,Azure为WebRoles使用相同的.net机器密钥自动解决了这个问题。

但这对于工作者角色实例不起作用。

是否有一个技巧让Azure使用相同的机器密钥来处理工作者角色的所有内容?

似乎比重写代码更容易为Owin生成令牌。

1 个答案:

答案 0 :(得分:4)

如果您的自托管应用可以引用System.Web,那么您可以使用与Microsoft.Owin.Host.SystemWeb相同的MachineKey实现。

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(),
                                    };