热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

web.configforms节点中的属性的含义和用途

authenticationmodeForms这样之后,ASP.NET运行时就知道我们启用了Forms验证,在生命周期的验证阶段就激活FormsA
authentication mode="Forms"/>

 

 

        这样之后,ASP.NET运行时就知道我们启用了Forms验证,在生命周期的验证阶段就激活FormsAuthenticationModule模块。
 
       还有一点要特别注意:元素节点只能在应用程序的根文件夹中的 web.config中配置。如果在子文件夹中使用这个节点就会报错。这也说明了每个应用程序只能定义一个身份验证类型。
 
       而且在节点中,我们还可以进行更多的设置。如下:

 


 <authentication mode&#61;"Forms ">
       <forms name&#61;"MyCOOKIE"
               loginUrl&#61;"Login.aspx"
              timeout&#61;"60"
              path&#61;"/"
              protection&#61;"All">            
       
       forms>
 authentication>

 

      我们下面就看看节点中的属性的含义和用途&#xff1a;
       name&#xff1a;定义身份验证COOKIE的名称。因为我们把身份验证的票据是存放在COOKIE中的&#xff0c;而且我们必须给身份验证COOKIE取具有唯一性的名称&#xff0c;防止和其他的应用程序中的COOKIE冲突。


       loginUrl&#xff1a;从英文名字就可以知道是关于登录的。实际上就是标明把用户重定向到哪个页面取登录。


       timeout:设置身份验证COOKIE持续的时间&#xff0c;以分钟为单位的。而且这个时间是一个相对的时间&#xff0c;就是说每次对用户进行验证时&#xff0c;COOKIE的期限就会被重新设置。如果在60分钟内用户再没有向服务器发起请求&#xff0c;那么COOKIE就过期&#xff0c;之后如果用户再次发起请求&#xff0c;那么就要重新输入用户名和密码等信息。


       path&#xff1a;设置COOKIE的保存的路径&#xff0c;一般是设置为"/"&#xff0c;我们不要轻易的改变。
 
       我们之前也说过&#xff0c;我们的身份验证的票据是加密以后再存放如COOKIE中的&#xff0c;然后再把COOKIE发送到客户端。当客户端再次请求的时候&#xff0c;再服务器端就会解析客户端发送来的COOKIE信息&#xff0c;我们必须要确认&#xff1a;客户端发送来的COOKIE信息就是我们之前从服务器端发送过去的&#xff0c;也就是说&#xff0c;我们要判断&#xff0c;我们的COOKIE在客户端是否被篡改了。
 
       所以&#xff0c;这就是中属性protection的用途。protection的值有四个&#xff1a;
       Encryption:对COOKIE的内容信息进行加密。
       Validation:向COOKIE中的内容添加MAC(消息验证代码),以便服务器判断COOKIE是否被篡改了。
       None&#xff1a;禁用加密和篡改检查
       All:同时启用加密和篡改检查。
 
       默认情况下是"All"&#xff0c;因为它可以把数据加密放入COOKIE中&#xff0c;而且对返回到服务器端的COOKIE进行验证。

 
       用户信息的存储
 
       我们一般把用户的信息&#xff0c;如用户名和密码存放在数据库中。如之前一篇文章说的&#xff0c;我们也可以把用户的用户名和密码信息直接放在web.config文件中。
 
       Forms验证其实对把用户凭证信息放在哪里提供了很大的灵活性。默认情况下是放在web.config中的。如下代码&#xff1a;


 <authentication mode&#61;"Forms ">
       <forms name&#61;"MyCOOKIE"
              loginUrl&#61;"Login.aspx"
            
              timeout&#61;"60"
              path&#61;"/"
              protection&#61;"All">

        <credentials>
           <user name&#61;"xiaoyang" password&#61;"xiaoyang"/>
           <user name&#61;"panyan" password&#61;"panyan"/>
         credentials>
       
      forms>
 authentication>

 
       见上面的  节点&#xff0c;就是我们存放的用户信息。上面的信息是以明文(没有加密)的形式存放。我们也采用加密的方式存放&#xff0c;只要配置如下&#xff1a;&#xff0c;配置 passwordFormat的加密方式就行了。那么用户在传输之前就会被加密。
 
       还有就是把用户信息存储在数据库中&#xff0c;我们后面会讲述的&#xff0c;也是最常用的方式。
 


       web.config配置的一些用法
       1.在web.config中添加用户凭证
       我们之前说过了&#xff0c;ASP.NET的身份验证中&#xff0c;对于如何存储用户凭证提供了很大的灵活性。默认情况下是把凭证存储在web.config中的。
       我们还是来看看之前配置的一些节点信息&#xff1a;

 

 


   <authentication mode&#61;"Forms ">
        <forms name&#61;"MyCOOKIE"
              loginUrl&#61;"Login.aspx"
            
              timeout&#61;"60"
              path&#61;"/"
              protection&#61;"All">

         <credentials>
           <user name&#61;"xiaoyang" password&#61;"xiaoyang"/>
           <user name&#61;"panyan" password&#61;"panyan"/>
         credentials>
       
        forms>
   authentication>

 

       在中就是我们存储的用户的一些信息。不知道大家是否还记得我们之前已经说过了的Authenticate方法:只有把用户信息存放在了配置文件中&#xff0c;我们才可以使用这个方法&#xff0c;代码如下(判断提交的用户信息是否合法)&#xff1a;
  bool IsAuthenticate&#61; FormsAuthentication.Authenticate(userName, userPassword);
 
       2.拒绝匿名用户访问
       其实这是与用户授权的问题现关联的&#xff0c;关于授权问题&#xff0c;我们以后谈&#xff0c;这里只是简单的提下&#xff0c;算是预热吧&#xff01;
       我们可以拒绝匿名用户访问我们的网站&#xff0c;只要配置如下&#xff1a;

<authorization>
       <deny users&#61;"?"/>
   authorization>

 

 

       谈起这个节点&#xff0c;还是有一些话题的&#xff0c;这个我们在专门讲述授权的时候具体谈。现在我们的重点是验证&#xff01;
 

 

 


       Forms验证一些简单的使用


       其实对于任何一种验证来说&#xff0c;无非就是提供输入用户信息的界面&#xff0c;也就是常见的登录页面。登录页面可以很简单&#xff1a;只要提供输入用户名和密码的输入框就行了&#xff0c;而登录页面的功能就是验证输入信息是否正确&#xff0c;如果正确就创建身份验证的票据并且保存在COOKIE中。
 下面就看看一个简单的页面以及代码的实现&#xff1a;

 

 

       注&#xff1a;界面很简单&#xff0c;大家可能会想到ASP.NET现有的Login控件&#xff0c;但是Login是基于MemberShip的。现在谈MemberShip还过早&#xff0c;因为我们后面文章专门的讲解从Forms验证到MemberShip的自然过渡&#xff0c;那样大家就可以很清楚的知道MemberShip到时怎么回事。
 
       代码部分&#xff0c;其实主要是"登录"按钮背后的代码&#xff1a;

 


 protected void  btnLogin_Click(object sender, EventArgs e)
{

     if (FormsAuthentication.Authenticate(txtUserName.Text, txtUserPasswork.Text))
        {
             FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, false);
        }
     else
        {
             throw new Exception("登录失败&#xff01;&#xff01;&#xff01;");
        }
}

 

        代码的前提是&#xff1a;我们把用户的信息存放在了web.config文件中&#xff0c;因为我们用了Authenticate方法。
       首先代码就判断提供的用户名和密码是否正确&#xff0c;如果正确&#xff0c;那么就通过了验证&#xff0c;那么我们就调用RedirectFromLoginPage就把用户定位了他们最初请求的页面。
       注意&#xff1a;当我们调用RedirectFromLoginPage方法时&#xff0c;RedirectFromLoginPage就创建一个身份验证的票据&#xff0c;即把用户的信息写入票据中&#xff0c;并且加密&#xff0c;并把票据写入COOKIE&#xff0c;然后就把用户定位了他们最初请求的页面。我们只是写了一行代码就实现了很多的功能。
 

      还有一点就是RedirectFromLoginPage方法的第二个参数指出了是否应该创建一个持久性的COOKIE&#xff0c;即用户关闭浏览器后依然保留COOKIE。我们常常实现"记住我"的功能就是传入了true.
 
       当我们登录了之后&#xff0c;要注销也只要一行代码&#xff1a;

 

protectedvoidbtnloginOut_Click(objectsender, EventArgs e)
{
FormsAuthentication.SignOut();
}

 

 

       Forms验证中的COOKIE问题


       之前我们所见到的示例都是利用非持久性的身份验证COOKIE来维持请求之前的身份验证。这就意味着&#xff1a;如果用户关闭浏览器&#xff0c;COOKIE就期满失效&#xff0c;下次还需要在此登录。从安全的方面还说&#xff0c;这是个好事。


 身份验证COOKIE中保存的身份验证票据是ASP.NET应用程序识别用户的工具。例如&#xff0c;如果一个用户拥有一个管理员的有效验证票据&#xff0c;那么我们的ASP.NET网站就会认为这个用户就是管理员。


       尽管使用持久化的身份验证COOKIE风险很大&#xff0c;但是还是有很多的用处的。例如&#xff0c;如果我们只是仅仅为了区别不同的用户&#xff0c;而不是对受限资源的访问进行限制&#xff0c;那么我们就不要求用户在每次访问站点时都登录&#xff0c;这样我们就可以利用持久化的COOKIE&#xff0c;而且创建持久化的COOKIE也很简单&#xff0c;如我们之前用的RedirectFromLoginPage&#xff0c;只要把方法的第二个参数设置为true就行了。


       除此之外&#xff0c;创建持久化的身份COOKIE&#xff0c;我们还可以使用SetAuthCOOKIE,并且把第二个参数设置为true。如下&#xff1a;
       FormsAuthentication.SetAuthCOOKIE(txtUserName.Text, true);

       持久化的COOKIE只有在调用了FormsAuthentication.SignOut();方法之后才会过期。并且持久化的COOKIE不会受到web.config中的节点中设置的超时的影响。如果我们希望持久化的COOKIE超时&#xff0c;我们就要调用FormsAuthentication类的GetAuthCOOKIE方法&#xff0c;设置COOKIE的期满日期和时间&#xff0c;并且我们自己手动的把它写入HTTP响应。


       如下面的代码&#xff0c;我们创建一个时间为一周的持久化的COOKIE(代码加了注释)&#xff1a;

 

protectedvoidbtnLogin_Click(objectsender, EventArgs e)
{
                //判断用户提供的验证信息是否正确
if(FormsAuthentication.Authenticate(txtUserName.Text, txtUserPasswork.Text))
{
                        //创建一个持久化的身份验证COOKIE
HttpCOOKIE COOKIE &#61;FormsAuthentication.GetAuthCOOKIE(txtUserName.Text, true);

                        //设置COOKIE的有效时间
COOKIE.Expires &#61;DateTime.Now.AddDays(7);

                        //手动添加到HTTP响应中
Response.COOKIEs.Add(COOKIE);

                        //跳转到最初请求的页面
Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUserName.Text, true));
}
                else
{
                        thrownewException("登录失败&#xff01;&#xff01;&#xff01;");
}
}

       其中GetRedirectUrl获取用户最初请求的URL

http://www.cnblogs.com/yanyangtian/archive/2009/05/28/1491227.html


转载于:https://www.cnblogs.com/goodsunny/archive/2013/06/02/3114318.html


推荐阅读
author-avatar
Remember_Mi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有