
最近做一个 Web 项目,需要用到跨应用程序进行身份验证,记得 ASP.Net 支持在分布式环境中进行 Forms 身份验证,分布式环境指的是跨单个服务器上的多个应用程序或网络场。在这里我们看一下 Forms 验证的流程,如下图所示:

查 MSDN 得知:
对于参与共享 Forms 身份验证的所有应用程序,<forms> 元素配置节中的多个配置属性必须匹配。下面示例中的指令 name、protection、path、validationKey、decryptionKey 和 validation 在所有应用程序间必须是相同的(除非另外说明)。
<configuration>
<system.web>
<authentication>
<forms name=".ASPXAUTH"
loginUrl="logon.aspx"
protection="all" <!-- Protection must be identical.-->
timeout="30"
path="/" > <!-- Path must have a compatible scope.-->
</authentication>
<!-- Validation and decryption keys must exactly match and cannot
be set to "AutoGenerate". The validation algorithm must also
be the same. -->
<machineKey>
validationKey= "C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
decryptionKey= "8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"
validation="SHA1"
isolateApplications="false"
</machineKey>
</system.web>
</configuration>
用于 Cookie 数据的加密和验证密钥以及加密方案必须完全相同。如果设置不匹配,则不能共享 Cookie。
发出 Cookie 之后,将根据 Cookie 自身中的 Expires 值跟踪 Cookie 的到期时间。这意味着如果两个应用程序具有不同的 timeout 属性,则将在 Cookie 的整个生存期中保留最初发出每个 Cookie 时设置的到期日期和时间。当更新 Cookie 时,Cookie 的原始到期时间用于计算新到期时间。使用配置 timeout 值的唯一时间就是最初创建 Cookie 的时间。
这里说一下 <machineKey>节,在 machine.config 中,<machineKey> 默认配置如下:
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey= "AutoGenerate,IsolateApps" validation="SHA1"/>
其中的 AutoGenerate 指定 ASP.NET 生成随机密钥并将其存储在本地安全机构 (LSA) 中,而 IsolateApps 则让 ASP.NET 用每个应用程序的应用程序 ID 为每个应用程序生成一个唯一的加密密钥。如果是对一台机器中的多个应用程序,可以移除 IsolateApps 选项,如果是对多台机器中的多个应用程序,可以将 IsolateApps 设定一个特定的值。
要想实现跨应用程序登录,在配置文件中关键有以下两点需要注意:
1、多个应用程序配置文件中 <authentication> 节中的 Name、Protection、Path 属性必须是一致的。
2、必须增加 <machineKey> 节。而且属性必须一致。
最后,按照 MSDN 中的配置代码,应用程序出现错误,原来 MSDN 中的这段配置代码是有误的,其中的 <machineKey> 节根本没有 isolateApplications 属性。去除这个属性后就可以了。