• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Asp.Net 4.0 FormAuthentication 原理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

建立一个使用Asp.Net Membership管理登陆登出信息的网站

 

1. 创建一个Asp.Net Mvc 3 示例网站。

2. 创建自定义的MemberShipProvider,并在Web.CONFIG中配置生效。

a. 创建MyMmbProv

class MyMmbProv : MembershipProvider
   2: {
   3:  
   4: ...........
///implement ValidateUser just return true, so any user name will be ok
string password)
   7:     {
true;
   9:     }
  10: }

b. 配置Web.config的Membership/Providers节点。

;providers>
;clear/>
;    
   8:   </providers>

         注意membership节点的defaultProvider 要设置为新增的MembershipProvider节点的名称。

3. 设置网站认证模式为Form

   3: </authentication>

此时Form认证使用Uri来存储cookie信息。

 

测试UseUri Form认证

登陆后发现页面的url中多了一长串类似加密cookie的内容:http://192.168.4.22/(F(fyt-FBDHvrANVba89TNUrMqn9w_ZgSN9xNEX3C8yIfbRIA-q6IyZhnKFh9mWwLN2kxuFUs0HxlKSTBSp7wPyoqxQhJGsguu1lbwjERZ3kfiHt1w7oD8x9LcGwZNjlY-yzM81YcMVyxbY3G74Yp5YOhGswI5NIg4Ehq3FOu0WbSo5BEkUeDbVFkeflmXZDfD70))/Home/About 而且LogOnPartial中显示出刚才登陆时输入的用户名称

将上述url粘贴到别的浏览器(或者其他同一局域网的机器上)(如上次测试使用chrome,这次使用firefox),发现自动登陆进去了,而且显示出同样的用户名,说明在该URL中至少已经包含了用户名称信息。

 

也就是说只要能够拿到用户登陆的URL就可以直接登陆该用户的账号!

 

测试UseCookies Form认证

将cookieless属性改为UseCookies

   3: </authentication>

用户登陆后每次页面请求都会带上cookie:

从上图中看到登陆数据提交后,返回的Response Headers有一个Set-Cookie的属性,这就是该用户的cookie信息。

登陆后查看其他页面时的页面数据如下图:

 

可以看到,登陆后每个页面请求的Request Headers 都会加上Cookie(如上图)。

那如果我们通过javascript给未登陆页面增加上述cookie信息结果会是怎样呢?

>
   1:  

function () {

function () {

).val();

   5:             document.cookie = cookieVal;

   6:         });

   7:     });

   8:  
</script>
>
>
   4:     Put content here.
/>
   6:     SessionId: @Session.SessionID
   7:     
>
>
/>
  11:  
/>
  13:  
/>
>

 

 

此时页面上显示为已登录状态,不过继续访问其他的页面会有所不同:其中无需认证的页面不会显示登录用户信息;而有认证要求的页面却会显示出登录用户的信息。

 

再将cookie_test=XXXXXXXXX赋给该页面,然后刷新页面发现已经是登出状态。

 

由此可见整个Asp.Net 的FormAuthentication都是依赖于cookie或者uri来实现登录的。

 

在类FormsAuthentication中可以看到:

bool hexEncodedTicket)
   2: {
   3:   FormsAuthentication.Initialize();
null)
string.Empty;
null || strCookiePath.Length < 1)
   7:     strCookiePath = FormsAuthentication.FormsCookiePath;
   8:   DateTime utcNow = DateTime.UtcNow;
double) FormsAuthentication._Timeout);
string.Empty, strCookiePath);
string str = FormsAuthentication.Encrypt(ticket, hexEncodedTicket);
null || str.Length < 1)
));
new HttpCookie(FormsAuthentication.FormsCookieName, str);
true;
  16:   httpCookie.Path = strCookiePath;
  17:   httpCookie.Secure = FormsAuthentication._RequireSSL;
null)
  19:     httpCookie.Domain = FormsAuthentication._CookieDomain;
if (ticket.IsPersistent)
  21:     httpCookie.Expires = ticket.Expiration;
return httpCookie;
  23: }

FromsAuthenticationTicket 包含了用户信息、过期时间、是否持久化、cookie路径,并且进过了加密处理。

 

另外:登陆时勾选记住密码后在..\Windows\Temporary Internet Files\ 文件夹中会多出一个文件

文件的内容如下:

cookie_test
39F80DBA2E9193EF18498E9B65186DAA0A259873DA0EF839990D457F53BBE2270325838A1BF9FF7409E10E8B13C1E7C805B3F2621C22065EEFAB12F953E4523163FD4ACC9F5312F0EC66112A81FDFFF2B5564481526D5B996F13EA42219AE760DD68CEEDD7E40E8BCD3F68D6E1BC0D73EE9D13798BAFB38B6143B334BE70BD31995430B3FCF90DC3A0514DB180682B9E
192.168.1.3/
9728
3254446592
30352998
4140518480
30352995
*

 

与Request Header 中的Cookie内容比较

cookie_test=39F80DBA2E9193EF18498E9B65186DAA0A259873DA0EF839990D457F53BBE2270325838A1BF9FF7409E10E8B13C1E7C805B3F2621C22065EEFAB12F953E4523163FD4ACC9F5312F0EC66112A81FDFFF2B5564481526D5B996F13EA42219AE760DD68CEEDD7E40E8BCD3F68D6E1BC0D73EE9D13798BAFB38B6143B334BE70BD31995430B3FCF90DC3A0514DB180682B9E

 

多出了IP地址以及过期时间。

cookie的写入读取都是由CookielessHelperClass来完成的。

本文测试代码

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET中的%%介绍发布时间:2022-07-10
下一篇:
asp.net验证码生成发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap