提前通行证,首先想到的是,经常用的网易的站内通行证,一处登陆,畅通无阻,怎么样,很方便吧?
      所以,在多系统中,该做法很是盛行,比如在企业级系统应用中。
     提个概念,那就是“单点登录”:
     单点登录(Single Sign On),简称为 SSO,是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
是目前比较流行的企业业务整合的解决方案之一。
     多说点,其实现机制:
     当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
  可以看出,要实现SSO,需要以下主要的功能:
  所有应用系统共享一个身份认证系统;
  所有应用系统能够识别和提取ticket信息;
  应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能。
  其中统一的身份认证系统最重要,认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。
   补充一下:单点登录的实质就是是含有身份验证票的Cookie能在项目间共用。 
      asp.net提供的验证方法:
     ASP.NET 的安全认证,共有“Windows”“Form”“Passport”“None”四种验证模式。
 windows验证即“IIS验证”,因为它主要是通过IIS实现的,毕竟用户请求页面时,首先遇到的是IIS,之后由IIS交给asp.net应用程序,因为iis赋予的身份由windows用户定义的,所以又叫windows验证;
“Windows”与“None”没有起到保护的作用,不推荐使用;
    “Form”“Passport” 之间,前者,“Form”验证用的广泛一些,重点了解一下。
Form验证是提交给服务器做的;步骤如下:
1、客户请求站点被保护的页面;
2、如果请求没有包含有效的认证cookie,web服务器将把用户重定向到web.config文件Authentication标签的LoginURL属性指定的URL,该URL提供一个供用户登录的表单;
3、认证被输入到表单中,并通过表单传送并被提交;
4、如果认证有效,则asp.net程序在本地创建一个认证cookie;
5、之后,用户被重定向到最初请求的页面;
认证设置成功之后,以后的请求自动被认证;
认证有效期:关闭浏览器或会话结束;

passport验证是通过订阅微软应用程序完成的;
   (所谓认证的通过与否,其实质就是检测有无发放有效的Cookie,使用Form也好,运用Passport也罢,都是Cookie在起作用。也就是说,我们只要把有效的Cookie在登录后一次性发放给客户端就得了。

使用Form验证方法实现单点登录简单示例:

一、修改 Web.config

 1、  打开项目中的Web.config;

 2、  找到 <authentication mode="Windows" /> 把它改成:

              <authentication mode="Forms">

 <forms loginUrl="Login.aspx" name=".ASPXAUTH"></forms>//Login.aspx为登录页面;

 </authentication> 

3、  找到<authorization> <allow users="*" /></authorization>改成

   <authorization><deny users="?"></deny></authorization> 

<authentication mode="Forms"> 

       <forms loginUrl="Login.aspx" name=".APSX"></forms> 

<deny users="?"></deny> 

 </authentication>  

二、 编写 .cs 代码——登录与退出 

1、  登录代码: 

a、   private void Btn_Login_Click(object sender, System.EventArgs e)

          {

               if(this.Txt_UserName.Text=="admin" && this.Txt_Password.Text=="admin")

               {

                      System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false);

      }

 } 

b、  private void Btn_Login_Click(object sender, System.EventArgs e)

          {

               if(this.Txt_UserName.Text=="admin" && this.Txt_Password.Text=="admin") 

              {

                    System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); 

     Response.Redirect("Default.aspx"); 

     }

 }

 以上两种都实现发放验证后的 Cookie ,通过验证的重要步骤: 

方法 a) 指验证后返回登录前的请求页面; 

方法 b) 则是分两步走:通过验证后就直接发放 Cookie ,跳转页面将由程序员自行指定(Response.Redirect("Default.aspx")),此方法多用于 Default.aspx 使用框架结构的系统;
2、  退出代码:

private void Btn_LogOut_Click(object sender, System.EventArgs e)

      {

         System.Web.Security.FormsAuthentication.SignOut(); 

}
三、如何判断验证与否及获取验证后的用户信息

一种方法用 Session 来判断;
    还有一种方法,且看下面代码:

if(User.Identity.IsAuthenticated)

         {

              //你已通过验证,知道该怎么做了吧?

}

 

 

 


   
posted on 2009-08-01 19:56  yhb199  阅读(274)  评论(0编辑  收藏  举报