ASP.NET使用无Cookie的表单认证票据

来源:互联网 发布:mac如何进入运行程序 编辑:程序博客网 时间:2024/04/29 12:31

ASP.NET使用无Cookie的表单认证票据

默认情况下,forms authentication system将决定是将票据存储在cookies collection里还是插入用户访问页面的URL里。所有主流的桌面浏览器,比如Internet Explorer,Firefox,Opera,或Safari都支持cookies,但并非所有的移动设备都支持。

forms authentication system使用何种cookie策略,取决于元素里的cookieless设置,它可以有如下四种配置:

.UseCookies——指定总是使用基于cookie的票据

.UseUri——指定从不使用基于cookie的票据

.AutoDetect——如果device profile不支持cookies,就不使用基于cookie的票据;如果device profile支持cookies,那么就运用一种探测机制来判断是否可以使用cookies.

.UseDeviceProfile——这是默认值,如果device profile支持cookies,就使用基于cookie的票据,不运用探测机制。

其中,AutoDetect 和 UseDeviceProfile选项都依靠一个device profile来判断是使用基于cookie还是无cookie的票据。ASP.NET有一个关于这种devices及其性能的数据库,比如某种devices是否支持cookies,它支持那个版本的JavaScript等信息。每次,当一个device向服务器发出对某个页面的请求时,该请求里将包含一

个名为“user-agent”的HTTP header,用于表明device的类型。ASP.NET将自动的把提供的user-agent字符串与数据库里相应的信息匹配起来。

注意:

该数据库存储在很多的XML文件里.这些默认的device profile文件,其路径为%WINDIR%/Microsoft.Net/Framework/v2.0.50727/CONFIG/Browsers。你也可以在你应用程序的App_Browsers文件夹里添加自定义的文件,关于这方面的更多信息,请参阅文章《How To: Detect Browser Types in ASP.NET Web Pages》

由于默认使用的是UseDeviceProfile选项.当访问站点的某个device不支持cookies时,就站点就使用无cookie的票据.

 

在URL里对票据进行编码

当浏览器每次向某个站点发出请求时,用来存储信息的载体通常是Cookies。但如果访问站点的device不支持Cookies的话,我们必须使用某种方法在客户端和服务器端传递票据,通常的做法是在URL里将cookie数据编码。

为了进行演示,我们将强迫站点使用无cookie的票据,为此我们将采用UseUri:

 

 

 

做了上述修改后,通过浏览器访问.当以匿名用户进行访问时,URL看起来和以前没什么区别,比如访问Default.aspx页面时,地址栏看起来和下面的差不多:

http://localhost:2448/ASPNET_Security_Tutorial_03_CS/default.aspx

然而一旦你登录后,票据将加密到URL里.比如,当以Sam的名义登录后,转到Default.aspx页面,这次地址栏看起来和下面的差不多:

http://localhost:2448/ASPNET_Security_Tutorial_03_CS/(F(jaIOIDTJxIr12xYS-VVgkqKCVAuIoW30Bu0diWi6flQC-FyMaLXJfow_Vd9GZkB2Cv-rfezq0gKadKX0YPZCkA2))/default.aspx

该票据已经被编码进URL。字符串(F(jaIOIDTJxIr12xYS-VVgkqKCVAuIoW30Bu0diWi6flQC-FyMaLXJfow_Vd9GZkB2Cv-rfezq0gKadKX0YPZCkA2)就是以16进制对票据信息编码后的效果。这于通常情况下存储在一个cookie里的数据是一样的。

为使无cookie的票据工作正常,系统必须对所有页面的URL编码以包含票据数据。另外,当用户点击一个链接时,票据也不会丢失。还好,该编码过程是自动执行的.为演示该功能,我们打开Default.aspx页面,添加一个HyperLink链接,分别设置其Text 和 NavigateUrl属性为“Test Link”和“SomePage.aspx”。当然,这并不是说我们的站点真的有个页面叫SomePage.aspx.

保存对Default.aspx的改动,再从浏览器访问它,先登录,以便把票据编码进URL,然后,在Default.aspx页面,点击“Test Link”链接.会发生什么?如果不存在SomePage.aspx页面,就会发生一个404错误,不过在这里这并不重要,注意观察地址栏,在URL里包含了该票据!

链接里的URL——“SomePage.aspx”,将自动的添加到一个包含票据的一个URL里——我们不用手写一行代码!票据将自动的编码进一个URL,只是该URL不能以 “http://”或“/”开头。至于该链接是出现在一个对Response.Redirect的调用,或一个HyperLink控件里,又或是一个anchor HTML元素(比如...)里,那到无关紧要.只要URL不是“http://www.someserver.com/SomePage.aspx” 或 “/SomePage.aspx”这样的形式,系统都会为我们自动编码。

注意:

虽然和基于cookie的票据一样,无cookie的票据也采取了某种过期策略,但无cookie的票据却更用户受到replay攻击,原因正是因为票据被编码进了URL.我们来设想一下,加入某个用户访问站点,成功登录后将URL复制下来通过电邮传给他的同事,在票据未过期之前,他的同事点击该链接,那么他们都能以那个发邮件的用户的名义登录系统了!