2015-04-12 84 views
22

我正在运行Azure网站。无论何时我部署,每个人都会因为machineKey更改而被注销。如何在Azure网站上设置machineKey

我在web.config中指定了machineKey,但这并未解决问题。我相信这是因为Azure会自动覆盖machineKey[1]

我在这里发现了一些类似的问题,但答案链接到死链接。

那么,有什么解决方案?当然,有一种方法可以让用户无论在Azure上进行部署,都可以保持登录状态。

+1

以WebRole或通过Azure网站托管的网站? –

+0

一个Azure网站。 –

+0

你确定它没有使用InProc会话来让你的用户注销吗?我们使用web.config中指定的machineKey在Azure网站上使用自动缩放进行cookie加密,并且在扩展或新部署时更改机器键方面没有问题。 – jakobandersen

回答

0

如果Azure正在重写您的machineKey,那么您无法做太多的工作,因为它是基础架构的一部分。但是,还有其他方法。

覆盖FormsAuthentication

这不应该是困难的,因为你可以很容易地查找了FormsAuthentication的源代码,并创建自己的逻辑和存储在web.config中或在你的数据库自己的密钥更换的machineKey。

自定义身份验证筛选

最简单的方法是创建一个过滤器,检查,验证,加密解密cookies在你的过滤器。您需要在OnAuthorization方法上执行此操作,并创建IPrincipal的新实例,并在解密成功时将IsAuthenticated设置为true。

的OAuth

  1. 启用OAuth的创造OAuthProvider。但是,您需要在您的控制台上的服务器上托管OAuthProvider,因为这需要machineKey工作。
  2. 启用第三方OAuth,如果您通过Google,Facebook等启用OAuth,将很容易,因为用户将被重定向到OAuth提供商,他们将继续自动登录并建立新会话。
15

试图将机器按键部分配置在Application_Start复位:

protected void Application_Start() 
{ 
    // ... 

    var mksType = typeof(MachineKeySection); 
    var mksSection = ConfigurationManager.GetSection("system.web/machineKey") as MachineKeySection; 
    var resetMethod = mksType.GetMethod("Reset", BindingFlags.NonPublic | BindingFlags.Instance); 

    var newConfig = new MachineKeySection(); 
    newConfig.ApplicationName = mksSection.ApplicationName; 
    newConfig.CompatibilityMode = mksSection.CompatibilityMode; 
    newConfig.DataProtectorType = mksSection.DataProtectorType; 
    newConfig.Validation = mksSection.Validation; 

    newConfig.ValidationKey = ConfigurationManager.AppSettings["MK_ValidationKey"]; 
    newConfig.DecryptionKey = ConfigurationManager.AppSettings["MK_DecryptionKey"]; 
    newConfig.Decryption = ConfigurationManager.AppSettings["MK_Decryption"]; // default: AES 
    newConfig.ValidationAlgorithm = ConfigurationManager.AppSettings["MK_ValidationAlgorithm"]; // default: SHA1 

    resetMethod.Invoke(mksSection, new object[] { newConfig }); 
} 

上述假设您在<appSettings>部分设置适当的值:

<appSettings> 
    <add key="MK_ValidationKey" value="...08EB13BEC0E42B3F0F06B2C319B..." /> 
    <add key="MK_DecryptionKey" value="...BB72FCE34A7B913DFC414E86BB5..." /> 
    <add key="MK_Decryption" value="AES" /> 
    <add key="MK_ValidationAlgorithm" value="SHA1" /> 
</appSettings> 

但你可以加载来自您喜欢的任何配置来源的实际值。

+0

非常感谢@ haim770。我现在正在测试它,它似乎正在工作。 –

+1

@ Mr.Flibble,我也在一个免费的Azure网站上测试过它。但是,由于Azure网站团队不断解锁越来越多的'Web.Config'部分,我相信他们最终会让您在配置中正常设置MachineKey。 – haim770

+0

真棒执行@ haim770。看来这不是为我们工作。我们使用.NET 4.6.1并使用OWIN启动与app.UseCookieAuthentication()并使用Redis缓存会话提供程序。我实现了上述功能,但用户在插槽交换后不断注销。有任何想法吗? – gorillapower

0

我有同样的问题,在我的情况下,我在VS13中使用webdeploy到Azure向导。我以为我疯了,因为我会在web.config中设置机器密钥,然后它将在部署的web.config上更改为自动生成。它在webdeploy脚本/设置中。我的解决方案是使用服务器资源管理器从VS13中打开实时Azure站点,然后编辑web.config并保存更改。这保存我的设置与我提供的键和一切正常。