网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

ASP.NET Forms身份认证

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/05
thenticationModule会给它一个默认的GenericPrincipal对象,此对象指示一个未登录的用户。

我认为ASP.NET的身份认证的最核心部分其实就是HttpContext.User这个属性所指向的对象。为了更好了理解Forms身份认证,我认为自己重新实现User这个对象的接口会有较好的帮助。

实现自定义的身份认证标识

前面演示了最简单的ASP.NET Forms身份认证的实现方法,即:直接调用SetAuthCookie方法。不过调用这个方法,只能传递一个登录名。但是有时候为了方便后续的请求处理,还需要保存一些与登录名相关的额外信息。虽然知道ASP.NET使用Cookie来保存登录名状态信息,我们也可以直接将前面所说的额外信息直接保存在Cookie中,但是考虑安全性,我们还需要设计一些加密方法,而且还需要考虑这些额外信息保存在哪里才能方便使用,并还要考虑随登录与注销同步修改。因此,实现这些操作还是有点繁琐的。

为了保存与登录名相关的额外的用户信息,我认为实现自定义的身份认证标识(HttpContext.User实例)是个容易的解决方法。
理解这个方法也会让我们对Forms身份认证有着更清楚地认识。

这个方法的核心是(分为二个子过程):

1. 在登录时,创建自定义的FormsAuthenticationTicket对象,它包含了用户信息。

2. 加密FormsAuthenticationTicket对象。

3. 创建登录Cookie,它将包含FormsAuthenticationTicket对象加密后的结果。

4. 在管线的早期阶段,读取登录Cookie,如果有,则解密。

5. 从解密后的FormsAuthenticationTicket对象中还原我们保存的用户信息。

6. 设置HttpContext.User为我们自定义的对象。

现在,我们还是来看一下HttpContext.User这个属性的定义:

  1. //  为当前 HTTP 请求获取或设置安全信息。  
  2. //  
  3. // 返回结果:  
  4. //     当前 HTTP 请求的安全信息。  
  5. public IPrincipal User { getset; } 

由于这个属性只是个接口类型,因此,我们也可以自己实现这个接口。

考虑到更好的通用性:不同的项目可能要求接受不同的用户信息类型。所以,我定义了一个泛型类。

  1. public class MyFormsPrincipal<TUserData> : IPrincipal  
  2.     where TUserData : classnew()  
  3. {  
  4.     private IIdentity _identity;  
  5.     private TUserData _userData;  
  6.  
  7.     public MyFormsPrincipal(FormsAuthenticationTicket ticket, TUserData userData)  
  8.     {  
  9.         if( ticket == null )  
  10.             throw new ArgumentNullException("ticket");  
  11.         if( userData == null )  
  12.             throw new ArgumentNullException("userData");  
  13.  
  14.         _identity = new FormsIdentity(ticket);  
  15.         _userData = userData;  
  16.     }  
  17.       
  18.     public TUserData UserData  
  19.     {  
  20.         get { return _userData; }  
  21.     }  
  22.  
  23.     public IIdentity Identity  
  24.     {  
  25.         get { return _identity; }  
  26.     }  
  27.  
  28.     public bool IsInRole(string role)  
  29.     {  
  30.         // 把判断用户组的操作留给UserData去实现。  
  31.  
  32.         IPrincipal principal = _userData as IPrincipal;  
  33.         if( principal == null )  
  34.             throw new NotImplementedException();  
  35.         else 
  36.             return principal.IsInRole(role);  
  37.     } 

网学推荐

免费论文

原创论文

设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号