【问题标题】:Does Forms Authentication work with Web Load Balancers?表单身份验证是否适用于 Web 负载均衡器?
【发布时间】:2011-03-22 10:24:03
【问题描述】:

我正在开发一个使用表单身份验证的 Web 应用程序。

    <authentication mode="Forms">
        <forms slidingExpiration="true"
         loginUrl="~/User.aspx/LogOn"
         timeout="15"
         name="authToken"  />
    </authentication>

当我登录时,我在浏览器中看到了这个 cookie:

问题是当我将此网站置于负载平衡模型中时会发生什么? ASP.net 会话 cookie 在哪里设置?我没有在代码中明确地这样做,所以我假设它发生在 ASP.Net 的某个地方的幕后。

另外,如果会话 cookie 是由网络服务器 A 设置的,我假设网络服务器 B 不会识别它并将其视为无效会话。如果是这种情况,我可能不想使用它,对吧?

【问题讨论】:

    标签: asp.net cookies session


    【解决方案1】:

    您必须将机器密钥设置为相同,并且两台机器上的名称都相同...如果这样做,您应该不会遇到表单身份验证的负载平衡问题。

            <authentication mode="Forms">
            <forms loginUrl="~/Login/Index" defaultUrl="~/"
                         name=".myportal"
                         protection="All" slidingExpiration="true" timeout="20" path="/"
                         requireSSL="false"></forms>
        </authentication>
    
        <machineKey validationKey="534766AC57A2A2F6A71E6F0757A6DFF55526F7D30A467A5CDE102D0B50E0B58D613C12E27E7E778D137058E" decryptionKey="7059303602C4B0B3459A20F9CB631" decryption="Auto" validation="SHA1"/>
    

    会话可能会稍微复杂一些。您可以将 ASP.Net 会话状态存储在数据库中,或使用共享会话提供程序使其也可用于负载平衡。

    这是一篇关于在数据库中存储会话状态的好文章:http://idunno.org/articles/277.aspx

    【讨论】:

    • 您还需要确保您使用的是跨机器工作的会话状态提供程序(即 not mode="inproc"),但除此之外,它可以正常工作很好。
    • 啊...我明白了,所以会话 cookie 必须类似于加密的时间戳。我假设机器密钥用于进行加密/解密,这就是为什么它需要相同。
    • 如果是负载均衡,则不能使用 Session 的 mode="InProc"。甚至没有粘性会话。您需要将其存储在 IIS、数据库中,或创建您自己的提供程序。我已经实现了将会话存储在 IIS 中,它工作得很好。
    • 没错。为了解密身份验证令牌,您需要共享验证密钥。
    • 所以要改成sql server,是不是这么简单:1)在IIS中从InProc改成SQL Server 2)在IIS中设置连接字符串(显然需要安装DB)
    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多