没有读取到,凭票验证
分类:微服架构

复制了一个文件夹到一网站下,该文件夹下带一个 web.config,其中指定了一些 AppSettings 节内容。

文章出处:

本例的站点结构图示为:

                                                                 ASP.NET 配置文件纵横谈(一)

但竟然读取不到 web.config 的内容。


Web站点
--- 相关文件夹及文件
--- Default.aspx页面
    Default.aspx.cs
--- web.config
--- A文件夹
    --- Default.aspx页面
        Default.aspx.cs
    --- web.config
--- B文件夹
    --- Default.aspx页面
        Default.aspx.cs
    --- web.config

     前言:之所以写这个系列的文章的缘由来自于Jeffery Zhao.之前看老赵的“MVC"讲座的时候,记得老赵曾经说过:一个真正的ASP.NET程序员应该对配置文件web.config要很熟练,而且对于配置文件的节点的相关知识都要很了解,现有的很多的ASP.NET书籍都只是将控件怎么使用等等,而且现有的一些参考文档都是只是讲讲配置节点怎么使用,很少详细的讲述配置文件的(注:老赵的原话不是这样的:)。所以这里我大胆的写了本系列的文章,有欠妥当的地方还望大家见谅!

打开 web.config,不作任何修改,再保存一次,效果就出来了,太奇怪了。

关于Forms验证的最好的教程,我觉得是microsoft press 出的黑皮书《microsoft.net 程序设计技术内幕》里的关于这一部分的讲解,此书的中文版由清华大学出版社出版。大家方便找到的话,可以看看。
窗体验证是asp.net最酷的新特性之一。简单说,窗体验证是一种安全机制,它通过要求用户在web窗体中输入凭据(通常是用户名和密码)来验证用户身份。您可以在web.config中指定登录页面并告诉asp.net登录页面保护什么资源。当用户第一次试图访问被保护资源时,asp.net会把用户重新定向到您的登录页面。如果登陆成功,asp.net会以cookie的形式发给用户一个验证票据,并把用户重定向到最初请求的页面。这张票据使得用户不必重复登录,就可以多次访问您站点上的被保护内容。您控制这张票据的生存期,所以由您决定登录适用于多长时间。
上面这段话明白吗?我们可以想以前asp的时候,要保护的页面都会有对cookie(或session)的判断,根据cookie的值来判断用户是否有访问这个页的权力。而具体做的时候,都是先要求用户登陆,成功后就把用户信息保存在cookie里面,然后用户就可以访问受保护的页。而现在asp.net提供了一种更加方便的功能来替你完成这些工作,就是上面说的Forms验证。就像分页,以前asp不也替你完成了嘛,可是到了asp.net这里,就得自己动手了……
过程是先建一个文件夹,然后把要保护的页面放进去,接着设置一下web,config,这样就完成了保护。如果你要访问这个文件夹,就会被强制转到预先设定的登录页面,你填上正确的用户名和密码,提交,系统验证后,就把你的登陆信息写到cookie里面,这样你再去访问那个文件夹,就可以进去了,因为你的登陆凭证已经保存到cookie里面了,系统检查后,知道你不是坏人,于是就……这个过程还是和以前asp时的过程差不多。
下面是具体的操作,先要建一个asp.net应用程序,这里面至少要有一个登录用的页面,然后修改你的根目录下的web.config,把验证那一块改成Forms验证模式。

实现如下效果:

 

<authentication mode="Forms" >
<forms loginUrl="login.aspx">
</forms>
</authentication> 

A,B文件夹下的页面
既可使用自己文件夹下的配置文件中的配置
又能使用整个站点的配置文件中的配置
但不能使用不在自己文件夹下的配置文件的配置
其中 可以看成
A,B文件夹下的web.config 继承于整个站点的web.config

系列文章链接:

ASP.NET 配置文件纵横谈(一)

ASP.NET 配置文件纵横谈(二)

ASP.NET 配置文件纵横谈(三) 

注意里面有一个forms节,定义了登录页面的位置,如果不指定,则默认是根目录下的login.aspx,还有,里面是区分大小写的。
通过这个设置,系统就知道这个asp.net应用程序使用Forms验证。
接下来在要保护的文件夹里放一个web.config,要注意的是,这个子文件夹里的web.config的实际内容不能像根目录下的那个一样多,否则就会出现“配置错误”,提示“在应用程序级别以外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。导致该错误的原因可能是在 IIS 中没有将虚拟目录作为应用程序进行配置。”具体应该怎么做我也不清楚,总之这个web.config只要有下面的内容就ok了

又扩展了符合自身文件夹下相关文件需要的相关配置

示例代码如下:

     

<configuration>
<system.web>
<authorization>
<deny users="?"></deny>
</authorization>
</system.web>
</configuration>

整个站点的web.config中有如下一段配置

  <connectionStrings>
    <add name="webconfigForAll" connectionString="webconfigForAll" />   
  </connectionStrings>

  首先我们就来看看配置文件的继承层次。都知道在ASP.NET中有很多的配置文件,如machine.config,web.config,特别是web.config出现在很多的地方,出现在不同的地方作用也不一样。而且我们还知道machine.config中的配置对服务器上所有ASP.NET网站起作用,而web.config中的配置就依据它所在的位置而定,如在一个网站根目录中的web.config就对整个网站起作用,在一个网站中的某个文件夹中的web.config就只对该文件夹起作用,而且网站跟目录中的web.config中的配置也对这个文件夹起作用。这就反映出了另外一个事实:配置文件是有继承层次的. 换个角度,对于一个网站中的某个文件夹,它不仅仅只是受本文件夹中web.config的配置约束,而且还收到本网站中根目录下的web.config的约束,而且还受到本台服务器上的machine.config的约束。

这是一个授权节,此节设置应用程序的授权策略。可以允许(allow)或拒绝(deny)不同的用户或角色访问应用程序资源。通配符: "*" 表示任何人,"?" 表示匿名(未经身份验证的)用户。看我们上面的设置知道,这样配置就是拒绝未经身份验证的用户访问。
然后可以试试访问那个受保护的文件夹里的页面了,嘿嘿,是不是立刻就被转到login.aspx了?这就是Forms验证的威力了,你必须要在这里正确登陆,然后才可以访问受保护的资源。
接下来自然就是登陆的问题了。
想想在asp的时代,我们的登陆事件是这样的:

A文件夹下的web.config中有如下一段配置

  <connectionStrings>
    <add name="webconfigForA" connectionString="webconfigForA"/>
  </connectionStrings>

 

sql="select name,password from yourtable where name="&name&" password="&password
set rs=con.execute(sql)
if not rs.eof
cookie("login")="ok"
end if 

B文件夹下的web.config中有如下一段配置

  <connectionStrings>
    <add name="webconfigForB" connectionString="webconfigForB"/>
    <remove name="webconfigForAll"/>
    <add name="webconfigForAll" connectionString="webconfigForB-All"/>
  </connectionStrings>

     下面我们就来具体的看看ASP.NET中的配置文件的继承层次:

上面是基本的过程了,注意这个做法是极不安全的,这里只是一个示例,而在Forms验证时的过程也差不多,即
if(1.输入的用户名和密码合法) then
2.给用户设定登陆凭证
end if
先看第一步,怎样检查输入的用户名和密码合法,这里有两个办法,如果你是把用户名和密码存在数据库里面,那就用以前的办法来解决,比如是islogin(string name,string password)方法,如果你输入正确的用户名和密码的话,这个方法就返回true。这个办法适用于很多用户的时候。 如果你的用户数量很少,那就可以考虑第二种办法,即把用户和密码放到web.config里。办法就是在根目录下的web.config文件中加入一个credentials节,这个是包含在forms节里面的

整个站点的Default.aspx.cs中有如下一段代码

    protected void Page_Load(object sender, EventArgs e)
    {
        string strConfigAll = System.Configuration.ConfigurationManager.ConnectionStrings["webconfigForAll"].ToString();
        string str = "整个站点文件夹下根web.config:->" + strConfigAll;
        Response.Write(str);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("../B/Default.aspx", true);
    }

     1.machine.confiig-在ASP.NET中,很多的默认的配置都是定义在这个配置文件中的,但是有一些配置已经从machine.config中移出到别的地方了,为了缩短ASP.NET的加载时间。我们知道在运行一个ASP.NET程序的时候,ASP.NET运行时是要加载很多的配置文件的,当然machine.config是一定要加载的,但是其中有些配置不是必须的,所以就移到别的地方,如果用到就加载。

<authentication mode="Forms" >
<forms loginUrl="login.aspx">
<credentials passwordFormat="Clear">
<user name="notus" password="wei"/>
</credentials>
</forms>
</authentication>

A文件夹下的Default.aspx.cs中有如下一段代码

    protected void Page_Load(object sender, EventArgs e)
    {
        string strConfig = System.Configuration.ConfigurationManager.ConnectionStrings["webconfigForA"].ToString();
        string strConfigAll = System.Configuration.ConfigurationManager.ConnectionStrings["webconfigForAll"].ToString();
        string str = "自身A文件夹下的web.config:->" + strConfig + "<br/>"
                   + "整个站点文件夹下根web.config:->" + strConfigAll;
        Response.Write(str);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("../B/Default.aspx", true);
    }

 

在这里设置后,程序中的判断是用System.Web.Security的FormsAuthentication类的一个方法System.Web.Security.FormsAuthentication.Authenticate(string name,string password),这个就是用来根据web.config文件中的credentials节指定的用户名和密码来进行合法性判断,如果你输入正确的话,这个方法就返回true。
验证完后,就进入第二个步骤给用户设定登陆凭证,这里也是用到System.Web.Security的FormsAuthentication类的一个方法
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(string,bool)这个方法接受两个参数,第一个string是用语cookie身份验证的用户名称,一般就用用户名,第二个是bool值,用于指定此cookie是临时的,还是永久性的,如果这里用false,那就是临时性的。临时性的cookie的生存期可以在web.config的forms节中指定
<forms loginUrl="login.aspx" timeout="10">
这里是把超时时间设为10分钟。而永久性cookie的生存期是50年,并且设定后就不可以更改,一般如果选择永久性的cookie的话,可以通过编程的办法来改变这个值,毕竟50年实在是太长了。
这个方法除了设定用户登陆凭证外,在最后还会把用户重定向到最初请求的页面,即当你没有登录而直接进入受保护的文件夹时想去的那个页面。如一开始直接进入登录页面,则最后会转向根目录下的default.aspx。
下面是具体的代码演示,这段代码是单击登陆页面的提交按钮后执行的,boxid和boxpd分别是输入用户名和密码的textbox

B文件夹下的Default.aspx.cs中有如下一段代码

    protected void Page_Load(object sender, EventArgs e)
    {
        string strConfig = System.Configuration.ConfigurationManager.ConnectionStrings["webconfigForB"].ToString();
        string strConfigAll = System.Configuration.ConfigurationManager.ConnectionStrings["webconfigForAll"].ToString();
        string str = "自身B文件夹下的web.config:->   " + strConfig + "<br/>"
                   + "整个站点文件夹下根web.config:->  " + strConfigAll;
        Response.Write(str);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("../A/Default.aspx", true);
    }

     2.在安装根目录中的web.config-在%windir%Microsoft.NETFrameworkv2.0.50727CONFIG中的配置文件,之前说过machine.config把很多的配置移出了,就放在这个配置中。

 1//第一种,用户资料保存于数据库时
 2private void butlogin_Click(object sender, System.EventArgs e)
 3{
 4   if(islogin(boxid.Text,boxpd.Text))
 5     FormsAuthentication.RedirectFromLoginPage(boxid.Text,false);
 6   else
 7     Response.Write("error"); 
 8} 
 9//第二种,用户资料保存于web.config时
10private void butlogin_Click(object sender, System.EventArgs e)
11{
12   if(FormsAuthentication.Authenticate(boxid.Text,boxpd.Text))
13     FormsAuthentication.RedirectFromLoginPage(boxid.Text,false);
14   else
15     Response.Write("error"); 
16} 
17

运行效果为:

站点运行后-》整个站点下的Default.aspx
             页面显示为:
             整个站点文件夹下根web.config:->  webconfigForAll
             点击按钮后:
          -》转入B文件夹下的Default.aspx
             页面显示为:
      自身B文件夹下的web.config:->  webconfigForB
             整个站点文件夹下根web.config:->  webconfigForB-All
             点击按钮后:
   -》转入A文件夹下的Default.aspx
             页面显示为:
      自身A文件夹下的web.config:->  webconfigForA
             整个站点文件夹下根web.config:->  webconfigForAll
             点击按钮后:
          -》转入B文件夹下的Default.aspx

 

 

这就是验证的基本过程。
而如果想要注销登陆,则用System.Web.Security的FormsAuthentication类的SignOut()方法

     3.在根目录中的web.config-我们也可以把web.config放在根目录中,让它对整个根目录起作用。如:c:inetpubwwwroot.因为我们可以新建很多的虚拟目录文件夹,文件夹中有网站程序,如果把配置文件放在虚拟目录中,那么配置就对整个文件夹中的网站起作用。

1 private void butquit_Click(object sender, System.EventArgs e)
2 {
3    FormsAuthentication.SignOut();
4 }
5 

 

它返回一个Set-Cookie头,将Cookie的值设置为一个空字符串,并将Cookie的到器日期设置为一个过去的日期,从而有效销毁验证cookie。
而在实际情况下,您可能更愿意在顶层web.config文件中完成所有的url授权,而不是把它们分在各自目录下的web,config文件中。asp.net也支持这种做法。下面这个web,config文件,放在应用程序根目录下,它启用窗体验证并指定其他的一些设置。假设您要保护的文件夹名为protd。

     4.一个网站中的web.config-这是我们最常见的配置地方。

<configuration>
<system.web>
<authentication mode="Forms" >
<forms loginUrl="login.aspx">
<credentials passwordFormat="Clear">
<user name="notus" password="wei"/>
</credentials>
</forms>
</authentication>
</system.web>
<location path="protd">
<system.web>
<authorization>
<deny users="?"></deny>
</authorization>
</system.web>
</location>
</configuration>

     5网站中的某个文件夹中的web.config-我们常常通过这个配置文件来限制对文件的访问权限。

注意它的层次结构,应该有两个<system.web>节。完成这个后,就可以把protd文件夹下的那个web.config删掉,然后看看效果如何。
基本的知识就这么多了,其实Forms验证还有很多内容,比如怎样以编程的方式改变永久性cookie的生存期,怎么使用基于角色的验证等,这些大家找相关资料研究研究吧。当然还是推荐上面说到的那本书,以前关于Forms验证的也看了不少资料,但总是不明白,结果昨天一看那本书的讲解,就豁然开朗了。
最后再给出我常用的一个islogin()代码。希望可以对初学者有些帮助。

 

 1public bool islogin(string name,string password)
 2{
 3   bool isok=false;
 4   string errmsg="ok";
 5   StringBuilder sbsel=new StringBuilder();
 6   sbsel.Append("select name,password from youtable where name='");
 7   sbsel.Append(name);
 8   sbsel.Append("'");
 9   try
10   {
11      cmd=new OleDbCommand(sbsel.ToString(),conn);
12      conn.Open();
13      OleDbDataReader dr=cmd.ExecuteReader(CommandBehavior.SingleRow);
14      if(dr.Read())
15      {
16         if(dr["password"].ToString()==password)
17         isok=true;
18      }
19      errmsg="login is ok";
20   }
21   catch(OleDbException ex)
22   {
23      errmsg=ex.Message;
24   }
25   finally
26   {
27      conn.Close();
28   }
29   return isok;
30}
31

     上次就是配置文件的层次关于,下一级的配置文件的作用是在它上面所有配置约束的总和。就是说:一个网站中的文件夹的配置约束是machine.config+web.config+...+web,config(这个说法不是很恰当,希望大家明白意思就好)。

 

 

     今天就先说到这里!

本文由10bet手机官网发布于微服架构,转载请注明出处:没有读取到,凭票验证

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文