ASP.NET中的单点登录

对于大多数的web应用程序,很多人喜欢采用表单验证的方法。当许多应用程序运行在一个主域下面的多个子域时,使用单点登录将是很不错的一个选择,当用户在http://www.exapmle.com/登录之后,可以访问everything.example.com的资源。

表单验证默认不支持这种特性,但是,通过合适的方法调整它并不复杂。

ASP.NET表单验证的技术内幕并不复杂:它创建了一个特殊的Cookie,这个cookie的名字由web.config中的forms元素的name定义,它包含加密的验证数据,该cookie默认的名字是.ASPXAUTH。

出于保护用户隐私和安全的原因,cookie默认和主机名关联。但是cookie的机制支持一台主机的cookie在该主机所在的域内被接受,意味着主机server1.example.com的cookie可以在整个example.com中使用。

可以设置二级域和三级域的cookie,但是不允许设置顶级域的cookie,例如设置.com的cookie就是不允许的。

下面开始进行设置,看需要进行什么工作。

开始设置

和其它的应用程序一样,必须先在system.web中设定authentication,例如:

<authentication mode="Forms">

<forms name="DomainLoginAuth" loginUrl=" http://WebLogin/Default.aspx" protection="All"/>

</authentication>

正如前边提到的,验证的cookie是加密的,而加密的种子是随机产生的。当需要多个服务器协同工作时,那么将需要相同的加密种子。在system.web中加入如下的一段:

<MACHINEKEY

validationKey="BD52058A3DEA473EA99F29418689528A494DF2B00054BB7C"

decryptionKey="684FC9301F404DE1B9565E7D952005579E823307BED44885"

/>

如果采用DES加密的话,使用16个16进制符号,如果使用SHA1加密的话,使用48个16进制符号,ASP.NET默认采用的SHA1加密。

开始登录验证

必须在将验证cookie发送给客户之前,为cookie附加域信息,代码如下(假定用户名和密码已经经过验证并且使用的用户名存储在userName变量中):

HttpCookie authCookie = FormsAuthentication.GetAuthCookie(userName, false);

authCookie.Domain = "example.com";

Response.Cookies.Add(authCookie);

Response.Redirect(FormsAuthentication.GetRedirectUrl(userName, false);

注销

通常,用户注销时不需要进行什么设定,只要调用FormsAuthentication.SignOut()即可,但是这个函数不能处理域的cookie。

因此,应该手工删除这个cookie,手工删除这个cookie的唯一方法是将cookie的过期时间设定为过去的时间,参考如下的代码:

HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

authCookie.Domain = "example.com";

authCookie.Expires = DateTime.Now.AddDays(-1);

Response.Cookies.Add(authCookie);

好了,现在你的应用程序可以进行单点登录了。