微软的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. ASP.net的身份验证方式有哪些?分别是什么原理?

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

  2. 【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现

    在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候再登录 ...

  3. ASP.NET中 ValidationSummary(验证总结)的使用

    1.A,运行效果返回顶部 ValidationSummary(验证总结) 属性: DisplayMode:显示模式 List:类表 BulletList:无序列表 SingleParagraph:单行 ...

  4. ASP.NET 中的正则表达式

    引言 Microsoft®.NET Framework 对正则表达式的支持是一流的,甚至在 Microsoft® ASP.NET 中也有依赖正则表达式语言的控件.本文介绍了深入学习正则表达式的基础知识 ...

  5. 浅谈ASP.NET中render方法

    2011-06-08 11:36 runyl 博客园 我要评论(1) 字号:T | T Control.Render 方法是将服务器控件内容发送到提供的HtmlTextWriter 对象,此对象编写将 ...

  6. ASP.NET—016:ASP.NET中保存文件对话框

    本想在asp.net中使用savediallog保存文件,结果提示:当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作. 在ASP.NET中使用如下方式,保存文 ...

  7. asp.net中常用的几种身份验证方式

    前言 在B/S系统开发中,经常需要使用"身份验证".因为web应用程序非常特殊,和传统的C/S程序不同,默认情况下(不采用任何身份验证方式和权限控制手段),当你的程序在互联网/局域 ...

  8. asp.net中的窗体身份验证

    入门 在创建网站中,常常会使用到身份验证.asp.net中内置了几种身份验证的方式,如Windows.Froms.Passport等.这几种身份 验证的方式各有不同.一般来说,网站的身份验证方式都会经 ...

  9. asp.net中的窗体身份验证(最简单篇)

    在创建网站中,常常会使用到身份验证.asp.net中内置了几种身份验证的方式,如Windows.Froms.Passport等.这几种身份验证的方式各有不同.一般来说,网站的身份验证方式都会经过以下几 ...

最新文章

  1. 苹果发布首款 Mac 自研芯片 M1,贯通生态快人一步!
  2. Spring学习总结(4)——Spring AOP教程
  3. 高成本低收益的市场现状下 安防企业该怎么办?
  4. linux 常用命令总结
  5. 视频图像处理基础知识4(视频分辨率参考 行频 隔行扫描 逐行扫描)【转】
  6. SqlServer 0和空字符串''等价?-----类型的隐式转换问题
  7. InfoPath中的Rich Text Box中如何加“回车”
  8. PyPDF2 | 利用 Python 实现 PDF 分割
  9. JVM内存分配策略原
  10. Python的安装以及编译器的安装
  11. 简书3.3.1新出现的bug
  12. hibernate DetachedCriteria实现多表关联查询createAlias的使用
  13. 中文编码--中国程序员之”银弹“?
  14. Ten graph questions of about 2000 difficulty of Codeforces Round 1
  15. Java学习资料汇总
  16. Kindle Paperwhite安装PDF阅读器Koreader
  17. 梨花带雨html音乐播放器源码,梨花带雨 - 雨陌文化传媒 - 5SING中国原创音乐基地...
  18. 制表符输出语法分析器的格式
  19. 捷报|数说故事入选「广州市人工智能应用场景典型案例TOP100」
  20. WinForm 显示图片PictureBox控件

热门文章

  1. Qt Creator文本
  2. C语言orders order订单的算法(附完整源码)
  3. C++Miller Rabin算法的实现(附完整源码)
  4. C++为什么要内存对齐
  5. C和C++数据结构算法
  6. linux内核5.3支持cpu,Linux 5.3版内核重磅发布:支持中国兆芯x86 CPU
  7. Android EditText密码框的可见性设置
  8. Hive开发要知道数据仓库的四个层次设计
  9. 递归实现10进制转8进制,字符串数字互转,判断数组正逆向
  10. CSS :active 伪类