微软的ASP.NET提供了3种用户验证方式,即Windows验证、窗体(Forms)验证和护照验证(Passport)验证。
由于验证方式各不相同,因而这3种验证方式在使用范围上也有很大的不同, Windows验证方式只适用于放在受控环境里的网站; 也就是说,更适合于企业内网(Intranet)。窗体认证特别适合布置于互联网的应用,而护照验证方式适合于跨站之间的应用,用户只用一个用户名和密码就可以访问任何成员站,并且在注销离开时,所有护照信息都会清除,你可以在公共场所放心的使用。
我们在编写Web程序时,最多用到的便是窗体(Forms)验证方式,而微软提供了只要简单的配置Web.config文件就可实现这种简单的窗体(Forms)验证。为了能更好的使用窗体验证,我对这种验证方式进行了研究。

   

基于表单身份验证的类的命名空间:System.Web.Security
常用的几个类分别为:
1.FormsAuthentication 
   作用:为 Web 应用程序管理 Forms 身份验证服务
2.FormsAuthenticationTicket
 作用:提供对票证的属性和值的访问,这些票证用于 Forms 身份验证对用户进行标识
3.FormsIdentity
 作用表示一个使用 Forms 身份验证进行了身份验证的用户标识.(用户身份)
4.FormsAuthenticationModule
作用:启用 Forms 身份验证的情况下设置 ASP.NET 应用程序用户的标识
 
一、实现简单的验证方式

首先,我们可以通过配置Web.Config文件来实现简单的验证方式。先建立一个Web工程,然后在首页放登录控件。然后在这个工程下再建立一个目录,在这个目录下添加两个Web页面,设置成这个目录下的页面只有通过验证后再能访问。
在Default.aspx页中,输入用户名和密码,然后Click,如果密码和用户名正确,则通过验证就能转到新建目录下的一个页面上。如果没有通过验证,则不能访问目录下的页面。代码如下:
Void Logon_Click(object sender, EventArgs e)
{
   String UserName = UserEmail.Text;
   String UserPass = UserPass.Text;
  
   If(通过连接数据库判断用户和密码是否正确)
  {
 //将经过身份验证的用户重定向回最初请求的 URL 或默认 URL
    FormsAuthentication.RedirectFromLoginPage(UserName, Persist.Checkd);
  //这个函数是否建立Cookie:解决:建立Cookie
  Else
  {
   Msg.Text = Invalid credentials. Please try again.";
  }
}
 

 然后在建立的目录下,新建一个Web.Config文件
<configuration>
      <system.web>
           <authorization>
          <deny users="?" />   不充许没经过身份验证的用户进行访问
            </authorization>
      </system.web>
              </configuration>

在这个Web.Config文件中,设置了这个目录下所有文件的授权方式。这是一种URL授权。应用程序根据配置对匿名用户进行检查。URL授权在Web.config中的<authorization>区段内定义。
<authorization></authorization>区段中有两个标记,标记<allow>定义了许的用户、任务和操作,在<deny>标记中包含了不被充许的用户、任务和操作。
例如: <allow users = “*”>
      <deny users = “?”>
    “*”代表所有的用户,“?”表示匿名(没经过身份验证的)用户。
 
  在要目下的Web.Config中,我们同时要设置验证方式是基于Forms的
<authentication mode="Forms">
   <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"></forms>
</authentication>
<authorization>
    <allow users="*"/>
</authorization>

<forms>元素的有效属性
Name: 用于身份验证的Http Cookie的名称。
LoginUrl:没有通地验证的用户将要被重定向到的登录页面的URL.
Protection: Cookie数据的保护方法。
TimeOut: Cookie的过期时限,以分钟为单位。默认值为30
Path:Path用于已发出Cookie的路径。默认值为”/”。
 
 
二、实现复杂的验证方式(角色控制)

  构造GenericPrincipal 和 FormsIdentity 对象
GenericPrincipal : 表示一般用户
FormsIdentity:表示一个使用 Forms 身份验证进行了身份验证的用户标识

FormsIdentity类由 FormsAuthenticationModule在通过 Forms 身份验证对用户进行身份验证时使用。使用从 Forms 身份验证 Cookie 或 URL 解密的FormsAuthenticationTicket创建一个FormsIdentity的实例。然后,使用此FormsIdentity类的新实例构造一个新的 GenericPrincipal 对象,该对象将设置为当前 HttpContext的User属性的值

在Global.asax文件中,添加事件Application_AuthenticateRequest代码:
注:Application_AuthenticateRequest在这个事件中添加自定义身份验证的代码。
 
1、页面请求时获得cookie及角色值
using System.Web.Security;
using System.Security;
//这个事件用于页面请求时获得cookie及角色值
    protected void Application_AuthenticationRequest(object sender, EventArgs e)
   {
        //请求传递的Cookie集合中获得窗体身份验证Cookie
        //FormsCookieName:获取用于存储Forms 身份验证票证的Cookie 名称
        
        //FormsCookieName 用于引用存储FormsAuthenticationTicket 信息的Cookie
        string cookiename = FormsAuthentication.FormsCookieName;    
        
        //提供创建和操作各HTTP Cookie 的类型安全方法
        //HttpCookie类获取和设置各Cookie 的属性
        
        HttpCookie cookie = Reauest.Cookies[cookiename];  /*从cookiename得到cookie*/

        if (cookie == null)
            return;
        //从窗体身份验证cookie中提取和解密身份验证票据
        FormsAuthenticationTicket ticket = null;

        try
        {
            //返回值:一个FormsAuthenticationTicket 对象
            ticket = FormsAuthentication.Decrypt(cookie.Value);  //cookie:加密的身份验证票
        }
        catch(Exception err)
        {
            return;
        }

        if (ticket == null)
            return;

        //解析出用户在最初对用户进行身份验证时附加到票上的管道分隔的角色名称列表
        string[] roles = ticket.UserData.Split(new char[] { '|' });


        //创建一个FormsIdentity对象和一个GenericPrincipal对象。前一个对象从票名称中
        //获得用户名,后一个对象将此标识与用户角色列表包含在一起
        FormsIdentity ident = new FormsIdentity(ticket);

        GenericPrincipal princ = new GenericPrincipal(ident, roles);
        HttpContext.Current.User = princ;
   }

2、登录时可以得到用户信息以及是否已经登录 

//验证及得到用户信息
    private void Page_Load(object sender, System.EventArgs e)
    {
        FormsIdentity userIdentiy;
        FormsAuthenticationTicket objTecket;

        if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
        {
            userIdentiy = HttpContext.Current.User.Identity;
            objTecket = userIdentiy.Ticket;
            //可以从Ticket中获取用户信息
        }
        else
        {
            Response.Write("<script>alert('您没有登陆!');history.back()</script>");
            //或者指向登录页面
            Response.Redirect("Login.aspx");
        } 
}

3、登录时生成用户票据

private string Authorization(string username, string password)
    {
        //用户登录验证
        string ip = System.Web.HttpContext.Current.Request.UserHostAddress;
        string name = username;
        string pwd = password;

        if (ValidatePwd(name, pwd) = true)  //数据库验证,代码略
        {
            //创建身份验证票证
            FormsAuthenticationTicket ticker = new FormsAuthenticationTicket(1, name, DateTime.Now,
                                                DateTime.Now.AddMinutes(30), false, "");

            string encryptTicket = FormsAuthentication.Encrypt(ticker);
            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptTicket);
            Reponse.AppendCookie(cookie);

            //将用户重定向到最初的请求页面
            Response.Redirect(FormsAuthentication.GetRedirectUrl(name, false));

            //Resonse.Redirect(FormsAuthentication.RedirectFromLoginPage(name, false));
            //this.Session["UserName"] = username;
        }
        else
        {
            Response.Write("<script>alert('您的用户名或密码错误');</script>");
        }
    }

  解释:

Context.User.Identity.IsAuthenticated

  Context:获取与该页关联的 System.Web.HttpContext 对象

  User:为当前 HTTP 请求获取或设置安全信息

  Identity:获取当前用户的标识

  IsAuthenticated:获取一个bool值,该值指示是否验证了用户

ASp.net中Froms验证方式的更多相关文章

  1. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  2. ASP.NET中身份验证

    ASP.NET中身份验证有三种方式:Windows.Forms和Passport. 1.Windows验证,基于窗体验证,需要每个页面写上验证身份代码,相对灵活,但操作过于复杂: 2.Passport ...

  3. C# 中参数验证方式

    C# 中参数验证方式 一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空, ...

  4. ASP.net的身份验证方式有哪些?

    [转] ASP.net的身份验证方式有哪些?分别是什么原理? Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验 ...

  5. ASP.NET中身份验证的三种方法

    Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活.Forms 验证方式对基于用户的验证授权 ...

  6. ASP.NET Form身份验证方式详解

    注:不会涉及ASP.NET的登录系列控件以及membership的相关话题, 我只想用比较原始的方式来说明在ASP.NET中是如何实现身份认证的过程.   ASP.NET身份认证基础 在开始今天的博客 ...

  7. 两系统用asp.net forms 身份验证方式实现跨域登录信息共享

    1.两个系统的 web.config 都配置为 forms 验证方式( system.web —> authentication 节点) 2.在两个系统的Web.config里配置相同的 sys ...

  8. 在ASP.NET 中有哪些数据验证控件(请解释ASP.NET中以什么方式进行数据验证)?

    (1)RequiredFieldValidator:检查用户是否输入: (2)CompareValidator:检查两个表单输入项的输入信息是否存在某种指定关系,比如大.等于等: (3)RangeVa ...

  9. ASP.NET中的验证控件

    ASP.NET提供了如下的控件: RequiredFieldValidator: 字段必填 (ControlTovalidate设定要验证的控件) RangeValidator: 值在给定的最大值,最 ...

随机推荐

  1. js星星评分插件

    下载:https://files.cnblogs.com/files/wordblog/%E6%98%9F%E6%98%9F%E6%8F%92%E4%BB%B6.rar

  2. Jenkins的安装及使用(二)

    介绍两个方面:编译本地项目和拉取git代码并编译 在这之前,先要进行一个配置. 一.编译本地项目 开始添加任务,任务类型选择自由风格: 点击项目进入详情,源码管理选择无 在构建的地方选择项目,然后注意 ...

  3. 设置linux的console为串口【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-4074219.html 以Grub2为例:1. 修改文件/etc/default/grub   #显示启动菜 ...

  4. PGP工作原理及其安全体制

    现代信息社会里,当电子邮件广受欢迎的同时,其安全性问题也很突出.实际上,电子邮件的传递过程是邮件在网络上反复复制的过程,其网络传输路径不确定,很容易遭到不明身份者的窃取.篡改.冒用甚至恶意破坏,给收发 ...

  5. 0行代码实现任意形状图片展示--android-anyshape

    前言 在Android开发中, 我们经常会遇到一些场景, 需要以一些特殊的形状显示图片, 比如圆角矩形.圆形等等.关于如何绘制这类形状, 网上已经有很多的方案,比如自定义控件重写onDraw方法, 通 ...

  6. Java编程的逻辑 (21) - 内部类的本质

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  7. Java编程的逻辑 (26) - 剖析包装类 (上)

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  8. .NetCore 中使用AppMetrics向InfluxDB中添加监控数据并通过Grafana图像分析

    考虑到分布式部署监控环境是所有的请求情况,所以这一块一般在网关GateWay里面加比较省事,聚合在一起的,如果放在api服务中,如果只有1个还好,一旦部署Node多是很痛苦的事情 这天需要添加的Nug ...

  9. Codeforces Round #296 (Div. 1) B - Clique Problem

    B - Clique Problem 题目大意:给你坐标轴上n个点,每个点的权值为wi,两个点之间有边当且仅当 |xi - xj| >= wi + wj, 问你两两之间都有边的最大点集的大小. ...

  10. Java基础常见英语词汇(共70个)

    ——————————ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— Java英文单词 OO: object—oriented ,面向对象 OOP:obje ...