微软的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. <td>内容超出自动换行

    td 内容自动换行 table表格td设置宽度后文字太多自动换行 设置table 的 style="table-layout:fixed;" 然后设置td的 style=" ...

  2. 第13月第12天 Constraints priority

    1.Constraints priority 将evInputView的高度约束的priority设为750,evInputView的inputTextView如果不设高度约束,那么高度就是defau ...

  3. not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA

    Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AV ...

  4. Python程序员之面试必回习题

    写在前面 近日恰逢学生毕业季,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分[临近毕业每天课前用40-60分钟对之前内容回顾.提问和补充,专挑班里不爱说话就的同学回答]. 期待 ...

  5. String类的深入理解

    String不是基本数据类型,String和8种包装类型是不可变类.String和8种基本数据类型采用值传递. 关于方法区中的常量区和class文件中的常量区的关系,参考:https://www.cn ...

  6. 存储之磁盘阵列RAID

         存储之磁盘阵列RAID RAID是由美国加州大学伯克利分校的D.A. Patterson教授在1988年提出的.RAID名为独立冗余磁盘阵列(RedundantArray of Indepe ...

  7. 【Python】测试dpkt解析pcap

    1.前言 本想借助dpkt解析mail.dns.http来辅助分析pcap包进行分析,查阅资料学习却发现并不如使用scapy那么方便. dpkt是一个python模块,可以对简单的数据包创建/解析,以 ...

  8. MTD应用学习札记【转】

    转自:https://blog.csdn.net/lh2016rocky/article/details/70885421 今天做升级方案用到了mtd-utils中的flash_eraseall和fl ...

  9. Android Camera详解

    相关的类 android.hardware.camera2 Camera SurfaceView---这个类用于向用户呈现实时相机预览. MediaRecorder---这个类用于从摄像机录制视频. ...

  10. oracle数据库_实例_用户_表空间之间的关系

    基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库:Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库的 ...