4

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

这与 Web 场的问题相同,Azure 自动为 WebRoles 解决此问题,使用相同的 .net 机器密钥对 Web.config 中的所有实例。

但这不适用于 Worker Role 实例。

是否有让 Azure 对工作角色的所有实例使用相同的机器密钥的技巧?

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

4

1 回答 1

4

如果您的自托管应用程序可以引用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(),
                                    };
于 2015-02-06T22:33:30.533 回答