Keywords: single sign-on, across applications, across domains.
目标:实现对www.domain.com, sub1.domain.com, sub2.domain.com......的统一权限认证,既single sign-on 单点登录。说明一点,这里的每个地址对应的是一个独立的应用,也就是说在IIS里它们都是一个实际的站点。这和运用URL Rewiting技术实现的二级域名访问是不同的。URL重写实现的二级域名访问,对应的服务器端其实只是一个应用。实际上,IIS在处理这种二级域名的请求时,首先会检查有没有实际的站点配置在IIS上,如果有就会转向这个这个站点(这里讨论的就是这种情况下的跨域认证问题),如果没有就会转向主机头为空的那个站点,例如访问sub1.domain.com,如果IIS上没有配置这个域名,则iis就会把它转向domain.com上,而URL Writing是在domain.com这个应用上进行的。扯远了,还是回到single sign-on上。
实现:跨域的身份认证换句话说就是实现对认证信息的共享,ASP.NET的Forms认证,认证信息默认是加密存储在cookie里的,所以只要对cookie的加密方式,密钥,存储位置进行统一,认证信息就可以共享了。ASP.NET 2.0中的实现其实非常简单,只要修改一些配置信息就可以了。以sub1.domain.com, sub2.domain.com两个应用为例,为了实现两者的统一认证,必须保证下列配置的一致(标注红色的部分):
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="signin.aspx" defaultUrl="~/default.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true" cookieless="UseDeviceProfile" domain="domain.com" enableCrossAppRedirects="true"/>
</authentication>
<machineKey validationKey='64E5DACAC6FB2B3E34FE06887639909EF2A180D6CDCB2463EAF098BA3E24A4FAC6C2A6E48C2F80FEE32A751C4B33D3EC70D73C59D64340E4CF7D9E44B0BA0077' decryptionKey='BCCC63AF8E95BEA7393377CF2CF0CA35F1B5C09343404F44' validation='SHA1'/>
另外,如果打算对角色信息也可以共享,例如在sub1.domain.com里认证为具有administrators角色的用户在进入sub2.domain.com后仍然是administrators,则要保证以下配置信息的一致:
<roleManager cacheRolesInCookie="true" cookieName=".ASPXROLES" cookiePath="/" cookieProtection="All" cookieRequireSSL="false" domain="domain.com" cookieSlidingExpiration="true" cookieTimeout="30" createPersistentCookie="false" defaultProvider="SQLRoleProvider" enabled="true">
<providers>
<add name="SQLRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="MyConnectionString" applicationName="MyApp"/>
</providers>
</roleManager>
进而,如果想对认证信息统一进行管理,(如membersihp,roles),则应该对membersihp, rolemanager配置节的物理存储配置进行统一,主要是数据库的链接配置到统一的位置,applicationName配置成相同的。这时我们就会感觉到,ASP.NET 2.0 build-in的membersip, rolemanagement service,为我们实现集中的权限认证提供了便利。由于物理存储的结构相同,整合就变得十分方便。
附:下面这个链接可以用来生成machine key配置:
http://www.eggheadcafe.com/articles/GenerateMachineKey/GenerateMachineKey.aspx
References:
MSDN Configuring Forms Authentication Across Applications
Creating a Single Sign-on for ASP.NET Application and Legacy ASP Application (Part II)
Single sign-on across multiple applications in ASP.NET
Single Sign-On for everyone - ASP.NET Forums