摘要:续上次浅谈了一下passport 的实现。在自己的项目中也进行了运用。
就对于开发中发现的问题进行一下说明。
想达到的目的: 在多个应用系统共享一个用户身份验证系统,而用户在各应用系统中的权限由应用系统自己处理。
主要流程: 应用程序->当用户访问受限页面 -> 由MyPassport 进行身份验证 -> 用户注册 MyPassport 帐号 -> 登录 MyPassport -> 返回应用程序 -> 应用程序得到用户信息 -> 分析角色或权限 -> 访问受限页面
主要的类:
MYPassportAuthentication -- 提供为操作身份验证票提供帮助器实用工具的静态方法MYPassportAuthenticationModule : IHttpModule - 模块初始化和处置事件MYPassportAuthenticationEventArgs : EventArgs - 事件参数类MYPassportAuthenticationTicket - 验证票MYPassportConfiguration - 配置类MYPassportConfigurationHandler : IConfigurationSectionHandler - 配置分配MYPassportIdentity :IIdentity - 用户验证信息 与 HttpContext.User.Identity 统一
有了上面几个类的设计,就可以进行开发了。我们选用的数据传送方式是:"查询字符串",即"查询字符串" 做为应用程序间 Ticket 信息的信道
当一个应用程序需要登录时,转向MYPassport 的地址是 : http://mypassport.net/login.aspx?appId=11&ru=http://myapplication.com/somepage.aspxru为返回应用程序的地址, 其中的 AppId 为应用程序的ID号,用于当ru 信息丢失时使用。
当完成登录:返回应用程序,地址为: http://myapplication.com/somepage.aspx?ticket=%%^^&&( 这里的ticket 为加密后的票,在返回到 应用程序的 MYPassportAuthenticationModule 时,对request.url 进行分析,把ticket 分离出来,生成真正的 ticket,取得 用户信息,取得权限。完成注册。
一,MYPassportAuthentication 类 由于 Ticket 在网络上传送时,要对数据进行一下加密。等到达应用程序时再进行解密。得到我们想要的票信息。 public static MYPassportAuthenticationTicket Decrypt(string strTicket) // 进行解密 public static string Encrypt(MYPassportAuthenticationTicket ticket) // 加密
这些都是公共的方法,没有什么好说的。
二,MYPassportAuthenticationModule : IHttpModule 注册验证事件与处理
public event MYPassportAuthenticationEventHandler Authenticate;
public void Init(HttpApplication context) { context.AuthenticateRequest +=new EventHandler(OnEnter); context.EndRequest += new EventHandler(this.OnLeave); } 对ticket 进行处理。
web.config <httpModules> <add type="MYCom.Security.KK7PassportAuthenticationModule,MYCom.Security" name="MYPassport"/> </httpModules>
三, MYPassportAuthenticationEventArgs 验证事件参数。当发生验证时,取得用户的MYPassportIdentity 信息
四,MYPassportAuthenticationTicket......[
阅读全文]