当前位置: 首页 > 编程日记 > 正文

【原创】Cookie应用(二)

Cookie的作用很大,在很多技术方案中都有应用。它也是Forms身份认证模式所使用的一门技术点。

今天我就说一说它在Forms身份认证模式中都起到什么作用。

(一)理论知识

ASP.NET 使用身份验证提供程序实现附加的身份验证方案,这些身份验证提供程序独立于 IIS 身份验证方案并且只用于 IIS 身份验证方案之后。ASP.NET 支持下列身份验证提供程序:

  • Windows(默认)
  • Forms
  • Passport
  • None

若要启用 ASP.NET 应用程序的身份验证提供程序,请使用 machine.config 或 Web.config 中的身份验证元素,如下所示:

  • <system.web>   <!-- mode=[Windows|Forms|Passport|None] -->   <authentication mode="Windows" /></system.web>
    每个 ASP.NET 身份验证提供程序都支持 OnAuthenticate 事件,该事件在身份验证过程中发生,您可以使用该事件实现自定义的身份验证方案。该事件的主要目的是将实现 IPrincipal 接口的自定义对象附加到上下文中

上面引用了MSDN中的定义。

二:Forms身份认证

Forms 身份验证提供程序是一个身份验证方案,它使应用程序可使用 HTML 窗体直接从客户端收集凭据。客户端直接向应用程序代码提交凭据以进行身份验证。如果应用程序验证该客户端的身份,则它向该客户端发出一个 cookie,该客户端在后面的请求中提交该 cookie。如果对于受保护资源的请求不包含该 cookie,则应用程序将该客户端重定向到登录页。当验证凭据时,应用程序可以用多种方法存储凭据,如配置文件或 SQL Server 数据库。有关更多信息,请参见 Forms 身份验证提供程序。

注意   ISAPI 服务器扩展仅处理那些它拥有其应用程序映射的资源。例如,ASP.NET ISAPI 服务器扩展仅拥有特定资源(如 .asax、ascx、.aspx、.asmx 和 .config 文件,这里只给出这几个)的应用程序映射。默认情况下,ASP.NET ISAPI 服务器扩展以及随后的 Forms 身份验证提供程序不处理任何对非 ASP.NET 资源(如 .htm、.jpg 或 .gif 文件)的请求。

优点

  • 允许使用任意条件自定义身份验证方案。
  • 可用于身份验证或身份确认。
  • 不需要相应的 Windows 帐户。

缺点

  • 受制于 cookie 生存期的重放攻击,除非使用 SSL/TLS。
  • 仅适用于映射到 Aspnet_isapi.dll 的资源。

同样引用MSDN,接下来就用具体代码实现其功能。

(三)一步一步实现Form认证模式

第一步:配置

在Web.Config中配置如下

<system.web>

<authentication mode="Forms">
     <forms cookieless="UseCookies" name="LoginCookieName" loginUrl="Login.aspx"></forms>      
  </authentication>

</system.web>

第二:设置登录凭证

新建立页面Login.aspx,代码如下

前台

 1      <table>
 2         <tr>
 3             <td>登录名:</td>
 4             <td><asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
 5         </tr>
 6         <tr>
 7             <td>密码</td>
 8             <td><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>
 9         </tr>
10          <tr>
11             <td colspan="2"><asp:Button ID="Button1" runat="server" Text="提 交" οnclick="Button1_Click" /></td>        
12         </tr>
13      </table>

后台

 1  protected void Page_Load(object sender, EventArgs e)
 2         {
 3             if (!IsPostBack)
 4             {
 5                 if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
 6                     Response.Redirect("Test1.aspx");
 7             }
 8         }
 9 
10         protected void Button1_Click(object sender, EventArgs e)
11         {
12             FormsAuthentication.SetAuthCookie(txtName.Text, false);
13         }

创建一个测试页Test1.aspx

 1 <form id="form1" runat="server">
 2     <div>
 3       用户名:
 4       <asp:Label runat="server" ID="lblUserName"></asp:Label>
 5       已登录
 6       
 7       <asp:Button runat="server" ID="btnLoginOut" Text="退 出" 
 8             οnclick="btnLoginOut_Click" />
 9     </div>
10     </form>

后台

 1  protected void Page_Load(object sender, EventArgs e)
 2         {
 3             if (!IsPostBack)
 4             {
 5                 if (Request.Cookies[FormsAuthentication.FormsCookieName] == null)
 6                     Response.Redirect("Login.aspx");
 7                 else
 8                 {
 9                     lblUserName.Text = Request.Cookies[FormsAuthentication.FormsCookieName].Name.ToString();
10                 }
11             }
12         }
13 
14         protected void btnLoginOut_Click(object sender, EventArgs e)
15         {
16             FormsAuthentication.SignOut();
17         }

我们直接运行Login.aspx进行登录,然后再运行Test1.aspx,显示结果如下:

用户名: LoginCookieName 已登录

LoginCookieName正是我们在Web.Config中配置的name的值吗。再利用firefox的自带工具查看一下本页的Cookie值

名称  LoginCookieName

值   E446C4B9D24D0F623023D6563D64C64AC082A41D685F28CEE9AE4CEEDFD0FFEE0D845EEADEC13FC81F33CA7E4E6B28291E95273A813C2D216C67

34E4D752D0F2CAA5F4B11ACA9FC355765810AFF2B0AFAACCD7AAFD04DD669C0CB52112EC277BC9347B1F

主机  localhost

路径   /

加密   否

到期  会话期间完即失效

结果确认Form认证模式,其实就是利用Cookie的机制实现的。

是否经过认证我们还可以下面的代码来判断

if (Request.IsAuthenticated)
                {
                    Response.Redirect("Test1.aspx");
                }

(四)同域下Cookie共享问题

有的时候往往会累到同域下共享Cookie的一系列问题,我总结一下基本出现的问题。

情况一:比如在主域登录后,在二级域中不作为一个已验证的用户,相反也是如此。

例如:主域名www.test.com,二级域名pass.test.com,如果我们在www.test.com中输入用户名/密码进行认证,认证成功后我们用代码FormsAuthentication.SetAuthCookie来设置Cookie,Cookie的域名往往被认为是www.test.com,我们再访问pass.test.com时,它的域名默认是pass.test.com,因为Cookie和domain(域名)是相关联的,如果在请求中域名不一致,Cookie将被忽略因些,我们在设置Cookie时,请使用以下代码:

 FormsAuthentication.SetAuthCookie(txtName.Text, false);
            HttpCookie lcookie = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
            lcookie.Domain = ".test.com";
            Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text, false));

情况二:主域和二级域不能同时注销问题

根据情况一的解释,我们同理可以推出,如何注销了吧,代码如下:

            FormsAuthentication.SignOut();
            HttpCookie lcookie2 = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
            lcookie2.Domain = ".test.com";
            Response.Redirect("user.aspx");

(五) 自定义登录

上面可能一起我们在使用FormsAuthentication.SetAuthCookie来实现Form认证,其实我们还有另一种方式。代码如下

1 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
2    2, "NewLog", DateTime.Now, DateTime.Now.Add(10d), false, string.Empty);
3   string str = FormsAuthentication.Encrypt(ticket);
4 
5 
6   HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, str);
7   Response.Cookies.Add(cookie);

其效果和FormsAuthentication.SetAuthCookie是一样的。这样写可能更灵活。
还可以自定义一些用户特定信息。这个我们将在下一章来讲。

 转载的请注原创地址,谢谢。

转载于:https://www.cnblogs.com/yxhblog/archive/2012/06/18/2553828.html

相关文章:

艾伟_转载:探索.Net中的委托

废话 我本来以为委托很简单&#xff0c;本来只想简简单单的说说委托背后的东西&#xff0c;委托的使用方法。原本只想解释一下那句&#xff1a;委托是面向对象的、类型安全的函数指针。可没想到最后惹出一堆的事情来&#xff0c;越惹越多&#xff0c;罪过&#xff0c;罪过。本文…

OO第三阶段总结

1、 规格化设计的发展 我认为规格化设计的需求主要来源于在软件与互联网行业飞速发展下&#xff0c;工程随着代码量的增长&#xff0c;往往会显得异常的臃肿&#xff0c;难以阅读。这为多人合作的工程创造了巨大的不便。而在这样的背景下&#xff0c;大家都认为代码风格的统一和…

ubuntu18.04 -- 创建第一个Django项目

step1&#xff1a; 安装虚拟环境&#xff1a; sudo pip3 install virtualenv # 安装虚拟环境sudo pip3 install virtualenvwrapper # 安装虚拟环境扩展包# 编辑家目录下的 .bashrc 文件&#xff0c;在最下面添加下面三行代码 export WORKON_HOME$HOME/.virtualenvs #指定…

单链表逆序生成及逆置的完整实现

单链表逆序生成及逆置的完整实现 本例中单链表数据类型定义成int型&#xff0c;可更改 头文件1(1.h) 宏定义及Status类型定义 头文件2(2.h) 单链表基本操作函数与逆置函数 include"1.h" using namespace std;typedef int ElemType; typedef struct LNode{ElemTyp…

html frameset

两个frame <frameset cols"25%,75%"> <frame name "frame1" src"frame_a.php" /><frame name "frame2" /></frameset> 如果在PHP中要实现在frame刷新 frame echo "<meta http-equiv\"Refre…

黄聪:Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...

去空格及特殊符号 s.strip().lstrip().rstrip(,) 复制字符串 #strcpy(sStr1,sStr2) sStr1 strcpy sStr2 sStr1 sStr1 strcpy2 print sStr2 连接字符串 #strcat(sStr1,sStr2) sStr1 strcat sStr2 append sStr1 sStr2 print sStr1 查找字符 #strchr(sStr1,sStr2) # < 0 …

Java图形化界面设计——容器(JFrame)

Java图形化界面设计——容器&#xff08;JFrame&#xff09; 程序是为了方便用户使用的&#xff0c;因此实现图形化界面的程序编写是所有编程语言发展的必然趋势&#xff0c;在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构&#xff0c;现在就进入java图形化…

分库分表之后,主键的处理方法

面试题 分库分表之后&#xff0c;id 主键如何处理&#xff1f; 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题&#xff0c;就是 id 咋生成&#xff1f;因为要是分成多个表之后&#xff0c;每个表都是从 1 开始累加&#xff0c;那肯定不对啊&#xff0c;需要一个全…

用队列实现形如a+b@b+a#的中心对称字符的检验

用队列实现形如abba#的中心对称字符的检验 我用网上提供的一种思想&#xff0c;用循环队列实现了这个操作&#xff0c;具体代码如下。 /*函数名match,严格来说它并不是Status型*/ Status match(char *a){SqQueue q; //定义循环队列q ch…

如何使用JPA注解标注多对多的关系

假设应用场景如下&#xff1a;Teacher与Student是多对多的关系&#xff0c;其中&#xff0c;Teacher类对应teacher表如下&#xff1a; CREATE TABLE teacher (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(50) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCRE…

艾伟也谈项目管理,敏捷教练的工具箱

学习并不是简简单单的阅读和浏览&#xff0c;而是一个积累的过程&#xff0c;一个通过持续的学习&#xff0c;对自己的知识体系不断丰富、索引的过程。接下来我会从四个方面入手分享我的经验。 高质量的信息源和高效的学习 Google是一个很好的工具&#xff0c;通过它&#xff…

7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)

查看Odoo产品分析系列—-目录 CMR&#xff1a;Customer Relationship Management。企业为提高核心竞争力&#xff0c;利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互&#xff0c;从而提升其管理方式&#xff0c;向客户提供创新式的个性化的客户交…

用栈实现形如a+bb+a@的中心对称字符的检验

用栈实现形如ab&ba的中心对称字符的检验 将&前字符依次入栈与前字符进行比较即可&#xff0c;下面是方法 Status match(char *a){ //match方法 SqStack s; char c; char *pa; InitStack(s); while(*p!&){ …

Typedef用法(转载)

在C的学习过程中&#xff0c;现在才发现&#xff0c;以前有那么多被忽略的重点&#xff1b;现在是慢慢拾起这些重点的时候&#xff0c;通过百度和博客&#xff0c;我感觉我学到了很多东西&#xff0c;自己只是在别人说的基础上&#xff0c;按照自己学习的过程在这里记录一下&am…

JavaScript基本知识

数组的排序 JavaScript可以实现多维数组,对象数组等排序,语法如下 arrayobj.sort(sortfunction) 参数 arrayObj 必选项。任意 Array 对象。 sortFunction 可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略&#xff0c;那么元素将按照 ASCII 字符顺序进行升序排列…

七基于Fourinone实现MQ demo

2019独角兽企业重金招聘Python工程师标准>>> FourInOne也可以当成简单的mq来使用&#xff0c;该demo演示了队列和主题订阅两种模式的实现 一、队列 将domain视为mq队列&#xff0c;每个node为一个队列消息&#xff0c;检查domain的变化来获取队列消息。 Sender&…

Windows下安装XAMPP,Wordpress

配置XAMPP&#xff1a; 1、下载&#xff1a;https://www.apachefriends.org/zh_cn/download.html&#xff08;下载速度日了狗&#xff01;&#xff09; 2、安装XAMPP; 3、启动apache&#xff0c;MySQL&#xff1a; Apache启动错误&#xff1a; …

原生js实现复制

最后我的解决方案是&#xff0c;在页面中添加一个 div&#xff0c;手动写入内容innerHTML&#xff0c;然后把它隐藏掉 function copy(targetDom) {let range document.createRange();range.selectNode(hiddenErrcode);window.getSelection().removeAllRanges();window.getSele…

C#条件判断-根据条件判断要走的路-if结构

什么时候要用到if结构语句呢?如果有一个班的学生期末成绩不是很理想&#xff0c;原因是考题太难&#xff0c;教师希望根据学生平时的表现给不同学生加平时成绩分&#xff0c;条件如下&#xff1a; 如果平时每次都交作业&#xff0c;加20分&#xff1b;如果平时交了超过所有作业…

既往出现中性粒细胞减少的患者可以重新应用依那西普

原文 译文 Clin Rheumatol. 2011 Aug 5. [Epub ahead of print] Re-challenge with Etanercept in patients with Etanercept-induced Neutropenia. Haroon M, Daly M, Harney S. Source Department of Rheumatology, Cork University Hospital, Cork, Irela…

RTTI(三)相关函数1【转自大富翁】

第三部分RTTI相关函数 GetTypeData 函数 GetPropInfo 函数 FindPropInfo 函数 GetPropInfos 函数 SortPropList 函数 GetPropList 函数 GetObjectPropClass 函数 PropType / PropIsType 函数 IsPublishedProp 函数 IsStoredProp 函数 FreeAndNilProperties 函数 SetToString /…

中序非递归遍历二叉树

二叉树的递归算法虽然简单&#xff0c;但是会导致时间复杂度比较高&#xff0c;下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树&#xff0c;和元素类型为二叉树的栈 typedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild; }BiTNode,*BiTr…

修改属性使按钮处于无验证状态

.net 页面中如果有验证不为空的控件&#xff0c;而且有重置按钮。此时需要将重置按钮的属性设置为无验证状态 如图将CausesValidation属性设置为false转载于:https://www.cnblogs.com/xiaopanlyu/archive/2012/06/28/2568823.html

poj3253

本文地址&#xff1a;https://www.cnblogs.com/maplefighting/p/9116850.html 题目名称&#xff1a;Fence Repair 链接&#xff1a;http://poj.org/problem?id3253 题意&#xff1a;农夫准备把木板切成n块&#xff0c;每块长度为Li&#xff0c;每次切木板时需要花费切时木板的…

一起谈.NET技术,C#中int和System.Int32理解总结

最近园里的TeamOne写了一篇《[C#] int与System.Int32有什么区别》&#xff0c;发现里面有不少精彩的评论&#xff0c;所以忍不住想这篇文章总结一下: 本文的主要参考资料&#xff1a; 1.《理解C#中的System.Int32和int&#xff1a;并非鸡和鸡蛋》Author:Dixin 2.《[C#] int与Sy…

java多线程编程01---------基本概念

一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分&#xff0c;尤其是对于小白&#xff0c;次一系列文章的将会对多线程编程及其原理进行介绍&#xff0c;希望对正在多线程中碰壁的小伙伴有所帮助。 &#xff08;一&#xff09;进程、线…

Linux下查看Nginx,tomcat等的并发连接数和连接状态

1、查看Web服务器&#xff08;Nginx Apache&#xff09;的并发请求数及其TCP连接状态&#xff1a; netstat -n | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}或者&#xff1a; netstat -n | awk /^tcp/ {state[$NF]} END {for(key in state) print key,"t"…

Java笔记整理-02.Java基础语法

1&#xff0c;标识符 由英文字母、数字、_(下划线)和$组成&#xff0c;长度不限。其中英文字母包含大写字母&#xff08;A&#xff5e;Z&#xff09;和小写字母&#xff08;a&#xff5e;z&#xff09;&#xff0c;数字包含0到9。 标识符的第一个字符不能是数字&#xff08;即…

android中The connection to adb is down,问题和解决 AndroidEclipseAntXML

1.报错&#xff1a;BUILD FAILEDD:\workspace\ganji\build.xml:144: The following error occurred while executing this line:D:\workspace\ganji\build.xml:271: Unable to delete file D:\workspace\ganji\tmp\proguard\tmp.jar解决&#xff1a;已经开了一个模拟器了&#…

建立可扩展的silverlight应用框架 step-4

通过外部配置文件加载模块module 在上一节中为项目引入了“Prism”框架&#xff0c;并建立了一个Hello Prism做测试。这里要把项 目好好的整理一下。使其更加的合理和具有可扩展性。 我的目的是&#xff0c;在左侧的导航栏目里点击按钮&#xff0c;相应的右侧的主体部分显示不同…