如果我使用Azure网站的自动缩放功能,我是否需要设置特定的机器密钥?

时间:2014-04-24 00:28:38

标签: azure azure-web-sites machinekey

如果您使用Azure网站自动缩放,是否需要设置计算机密钥,以便加密的身份验证令牌可以在计算机之间共享?

这里有一个问题,be the same就像我要问的那样。但是,该问题涉及Azure Web角色。我问的是Azure网站。

1 个答案:

答案 0 :(得分:8)

不,你不需要。当Azure网站在2个(或10个)不同的VM上运行时,Azure网站将为所有实例设置相同的计算机密钥。

如果你想要一种快速而肮脏的方法来验证这一点,请在Application_Start()中使用以下代码,基本上这会将机器密钥写入名为%WEBSITE_INSTANCE_ID%的文件中,这是一个独特的环境变量实例。扩展到2台计算机,打开Always On设置,在一分钟之内,应在D:\home\site\wwwroot文件夹中写入2个文件,这些文件具有名称的长指针(2台计算机的实例ID),它们将包含同样的关键。

code credit goes to this

protected void Application_Start()
{
    var section = (MachineKeySection)
        ConfigurationManager.GetSection("system.web/machineKey");

    BindingFlags flags =
        BindingFlags.Instance |
        BindingFlags.NonPublic |
        BindingFlags.GetProperty;

    Func<string, byte[]> propertyReader = name => (byte[])section
        .GetType()
        .GetProperty(name, flags)
        .GetValue(section, null);

     using (
        var writer =
            new StreamWriter(Environment.ExpandEnvironmentVariables(@"%HOME%\site\wwwroot\%WEBSITE_INSTANCE_ID%.log")))
    {
        var key = ConvertToHex(
            propertyReader("DecryptionKeyInternal"));
        writer.WriteLine("DecryptKey: {0}", key);

        var iv = ConvertToHex(
            propertyReader("ValidationKeyInternal"));
        writer.WriteLine("ValidationKey: {0}", iv);
    }

}

private string ConvertToHex(byte[] binary)
{
    return binary.Aggregate(
        new StringBuilder(),
        (acc, c) => acc.AppendFormat("{0:x2}", c),
        acc => acc.ToString());
}