如果您使用Azure网站自动缩放,是否需要设置计算机密钥,以便加密的身份验证令牌可以在计算机之间共享?
这里有一个问题,be the same就像我要问的那样。但是,该问题涉及Azure Web角色。我问的是Azure网站。
答案 0 :(得分:8)
不,你不需要。当Azure网站在2个(或10个)不同的VM上运行时,Azure网站将为所有实例设置相同的计算机密钥。
如果你想要一种快速而肮脏的方法来验证这一点,请在Application_Start()
中使用以下代码,基本上这会将机器密钥写入名为%WEBSITE_INSTANCE_ID%
的文件中,这是一个独特的环境变量实例。扩展到2台计算机,打开Always On
设置,在一分钟之内,应在D:\home\site\wwwroot
文件夹中写入2个文件,这些文件具有名称的长指针(2台计算机的实例ID),它们将包含同样的关键。
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());
}