我们在登陆成功后,使用下面的3种方法,都是同一个目的:创建身份验证票并将其附加到 Cookie,

当我们用Forms认证方式的时候,可以使用HttpContext.Current.User.Identity.IsAuthenticated  (或者也可以用 Request.IsAuthenticated ,这个实际上也是调用的是User.Identity.IsAuthenticated来验证)来判断是否登陆;而这个判断就是依赖于这个Cookie里的信息判断用户是否登陆。 
FormsAuthentication.SignOut用来清除这个Cookie标记

Form身份认证依赖Cookie,Asp.net就是每次检查我们在配置文件中指定的Cookie名称,并解密这个Cookie来判断当前请求用户的登录状态

使用下面3种方法的前提是在web.config里面设置为表单验证

<authentication mode="Forms">
<forms name=".MyCookie" loginUrl="Login.aspx" protection="All" timeout="60"/>
</authentication>

1:FormsAuthentication.SetAuthCookie

演示:

FormsAuthentication.SetAuthCookie(UserInfo.UserName, false, FormsAuthentication.FormsCookiePath);

【System.Web.Security.FormsAuthentication.SetAuthCookie("fish", false);】后,Asp.net做了些什么, 回答这个问题其实很简单:自己用Reflector.exe去看一下Asp.net的实现吧。 
这里为了更让您能信服登录与Cookie有关,我将直接创建一个Cookie看一下 Asp.net能不能认可我创建的Cookie,并认为登录有效。请看代码:

如果执行这段代码,您将发现:【Request.IsAuthenticated】返回true,登录状态会显示"已登录"。 
至此,我们可以得出一个结论: Form身份认证依赖Cookie,Asp.net就是每次检查我们在配置文件中指定的Cookie名称,并解密这个Cookie来判断当前请求用户的登录状态。

2:FormsAuthenticationTicket

演示:

 ////创建身份验证票
FormsAuthenticationTicket AuTicket =new FormsAuthenticationTicket(
1, UserInfo.UserName, DateTime.Now, DateTime.Now.AddMinutes(30),
false, Request.UserHostAddress);
////将票据加密
string authTicket = FormsAuthentication.Encrypt(AuTicket);
////将加密后的票据保存为cookie
HttpCookie coo =new HttpCookie(FormsAuthentication.FormsCookieName, authTicket);
coo.Secure =false;
coo.Expires = AuTicket.Expiration;
coo.Path = FormsAuthentication.FormsCookiePath;
////加入新cookie
Response.Cookies.Add(coo);

3:FormsAuthentication.RedirectFromLoginPage

演示:

FormsAuthentication.RedirectFromLoginPage(UserInfo.UserName, false);

注释:

名称 说明
FormsAuthentication.RedirectFromLoginPage (String, Boolean) 将经过身份验证的用户重定向回最初请求的 URL 或默认 URL。
FormsAuthentication.RedirectFromLoginPage (String, Boolean, String) 使用 Forms 身份验证 Cookie 的指定 Cookie 路径,将经过身份验证的用户重定向回最初请求的 URL 或默认 URL。

FormsAuthentication.RedirectFromLoginPage的第二个参数,true表示保留持久cookie,过期时间就是web.config里的时间,如果是false则关闭浏览器就过期。

这一行代码实现你在填写登录名和密码后,成功就转到原先你想到的页面。

这后面的参数“false”说明是否永久保留cookie。True则表示永久保留,下次访问就不用输入密码了,否则断开本次链接后,下次还需要输入密码。这次参数也可以由用户选择,因为考虑到安全性,可以在用户名或密码的傍边放个checkbox,原来的语句可以为:

System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.txtname.Text,this.CheckBox.Checked);

RedirectFromLoginPage和FormsAuthenticationTicket的区别

如果你对.net身份验证不是很清晰,请看本文。本文用简单明了的语言,让你对RedirectFromLoginPage和FormsAuthenticationTicket有一个完整的认识。 
1)FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked)用于基于用户的验证 
此方法封装了生成身份验证票,写回客户端,浏览器重定向等一系列的动作 
RedirectFromLoginPage()方法首先生成生成身份验证票,然后调用FormAuthenticaiton.Encrypt() 方法,该方法将身份验证票加密为字符串,然后生成身份验证Cookie,再将此Cookie加入到Response.Cookies中,等待发送到客户端。最后RedirectFromLoginPage方法调用FormsAuthentication.GetRedirectUrl 方法获取到用户原先请求的页面,重定向到这个页面。 
1、在浏览器上创建一个cookie,其中包含一个验证令牌。 
2、返回刚才您所请求的页面; 
相当于这两句: 
FormsAuthentication.SetAuthCookie(UserName.Text,mycheckbox.Checked); 
Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text,mycheckbox.Checked); 
也就是说FormsAuthentication.RedirectFromLoginPage方法相当于一个封装的方法,简化了很多细节。

2)FormsAuthenticationTicket,用于基于角色的身份验证 
上面的非基于角色的方法中,用了FormsAuthentication.RedirectFromLoginPage 方法来完成生成身份验证票,写回客户端,浏览器重定向等一系列的动作。这个方法会用一些确省的设置来完成一系列的动作,在基于角色的验证中我们不能用这一个方法来实现,要分步的做,以便将一些定制的设置加进来:

1. 首先要根据用户标示,和用户属于的角色的字符串来创建身份验证票 
public FormsAuthenticationTicket( 
int version, //设为1 
string name, //用户标示 
DateTime issueDate, //Cookie 的发出时间, 设置为 DateTime.Now 
DateTime expiration, //过期时间 
bool isPersistent, //是否持久性(根据需要设置,若是设置为持久性,在发出 
cookie时,cookie的Expires设置一定要设置) 
string userData, //这里用上面准备好的用逗号分割的role字符串 
string cookiePath // 设为"/",这要同发出cookie的路径一致,因为刷新cookie 
要用这个路径 
);

FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket (1,"kent",DateTime.Now, DateTime.Now.AddMinutes(30), false,UserRoles,"/") ;

2. 生成身份验证票的Cookie 
2.1 将身份验证票加密序列化成一个字符串 
string HashTicket = FormsAuthentication.Encrypt (Ticket) ; 
2.2 生成cookie 
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket) ; 
FormsAuthentication.FormsCookieName 是用来获取web.config中设置的身份验证cookie的名字,缺省为" .ASPXAUTH". 
若身份验证票中的isPersistent属性设置为持久类,则这个cookie的Expires属性一定要设置,这样这个cookie才会被做为持久cookie保存到客户端的cookie文件中. 
3. 将身份验证票Cookie输出到客户端 
通过Response.Cookies.Add(UserCookie) 将身份验证票Cookie附加到输出的cookie集合中,发送到客户端. 
4. 重定向到用户申请的初试页面.

验证部分代码(这部分代码是在login.aspx页面上点击了登录按钮事件处理代码):

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

     string user = TextBoxUser.Text; //读取用户名 
     string password = TextBoxPassword.Text; //读取密码 
     if(Confirm(user,password) == true) //confirm方法用来验证用户合法性的 
    { 
         string userRoles = UserToRole(user); //调用UserToRole方法来获取role字符串 
         FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket (1,user,DateTime.Now,          DateTime.Now.AddMinutes(30), false,userRoles,"/") ; //建立身份验证票对象 
         string HashTicket = FormsAuthentication.Encrypt (Ticket) ; //加密序列化验证票为字符串 
         HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket) ; 
//生成Cookie 
          Context.Response.Cookies.Add (UserCookie) ; //输出Cookie 
         Context.Response.Redirect (Context.Request["ReturnUrl"]) ; // 重定向到用户申请的初始页面 
     } 
    else 
    { 
        // 用户身份未被确认时的代码 
    } 

//此方法用来验证用户合法性的 
private bool Confirm(string user,string password) 

    //相应的代码 

//此方法用来获得的用户对应的所有的role用逗号分割的一个字符串 
private string UserToRole(string user) 

    //相应的代码 
}

3)总结 
身份验证5步走: 
1、创建身份验证票 
2、加密身份验证票 
3、生成Cookie 
4、Cookie输出到客户端 
5、页面重定向

转载自:http://www.cnblogs.com/joeylee/p/3521131.html

asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie;FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket的更多相关文章

  1. Form 表单提交的几种方式

    简单的总结一下form表单提交的几种方式:1.最简单的方式 就用form的submit提交方式,这种提交方式是不需要回调函数的   这种方式最近到一个form提供action路径后台接受就可以< ...

  2. ASP.NET MVC Form表单验证与Authorize特性

    一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...

  3. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  4. python26:自定义form表单验证

    一.自定义Form的原理 1.1 各种form表单验证比较 只有python提供了form表单验证,其他的都没有提供.django提供的功能还不够强大.最强大的是微软的ASP.NET!我们可以自己写一 ...

  5. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

  6. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  7. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  8. form表单验证2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

随机推荐

  1. Javascript 笔记与总结(2-10)删除节点,创建节点

    [删除节点] 步骤: ① 找到对象 ② 找到他的父对象 parentObj ③ parentObj.removeChild(子对象); [例] <!DOCTYPE html> <ht ...

  2. 【FFXV】中物理模拟的结构以及游戏业界的乐趣

    11月2日是在日本兵库县神户会议中心召开的[SIGGRAPH ASIA 2015]的第一天,在游戏开发专门的研究会[R&D in the Video Game Industry]上,展开了[F ...

  3. 2.PHP内核探索:一次请求的开始与结束

    PHP开始执行以后会经过两个主要的阶段: 处理请求之前的开始阶段 请求之后的结束阶段 开始阶段有两个过程: 第一个过程是模块初始化阶段(MINIT), 在整个SAPI生命周期内(例如Apache启动以 ...

  4. Supesite 参数说明

    supesite有人看到的是强大的功能,我看到的是坑爷的一些用法,第一次看到block,我晕了.对于参数一头雾水,下面收集了一些,备用吧. supesite标签调用参数详解 参数: blocktype ...

  5. Seven-Segment LED Display Example Design an 8-to-1 multiplexer.

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION

  6. android导入项目出现R文件不能生成

    关于原因网上有好多,比如 1.有时候eclipse不自动编译,把project clean一下,让R.java重新生成   2.选择菜单  Project >> Clean ,前提是勾选上 ...

  7. php--数据库三范式

    关系数据库的几种设计范式介绍1.第一范式(1NF) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 所谓第一范式(1NF)是指数据 ...

  8. JQuery源码之“名叫extend的继承”

    提起JS中的继承很多”大神“们都会提起call,apply,单纯的对象赋值继承,以及原型链继承等众多的方式以及它们的不足之处,而且还会不时的把一些面向对象的设计模式”团团“的带出来,可谓是厉害非常啊! ...

  9. [LeetCode] Divide Two Integers( bit + 二分法 )

    Divide two integers without using multiplication, division and mod operator. 常常出现大的负数,无法用abs()转换成正数的 ...

  10. Android笔记:Socket通讯常见问题

    经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2  如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...