zoukankan      html  css  js  c++  java
  • Asp.net 中的web.config文件[网上收集]

      2004.10.17发表于blog.csdn.net/zxub

      在学习Asp.net的时候,发现web.config这个文件很有用,就找了些资料,汇集在这里,以供有需要的人参考。
      所有.NET的应用程序都将其信息保存在一个基于XML的配置文件里。Web应用程序会使用位于应用程序根目录下的web.config文件,用于ASP.NET应用程序的web.config包含的信息和其应用程序大多数的操作都相关。通过Web.config,你可为网站定义诸如自定义的404报错页、(身份)验证和授权等设置;如果允许跟踪,还可为ASP.NET的网页设置编译选项。
      Web.config在根层是 <configuration> 的标记。在这个标记内,可以添加许多其他的标记,在要定义的大部分的网站配置参数的地方,最常用,也是最有用的一个是 system.web 标记。另外,为定义 application-wide 的设置,要使用<appSettings> 标记。在这个标记中,可用 <add ... /> 标记定义0到多个设置。例如:如果我们希望增加一个数据库连接串参数,我们可以用如下的 Web.config 文件:

    <configuration>

    <!-- application specific settings -->

    <appSettings>

    <add key="connString" value="connection string" />

    </appSettings>

    <system.web>

    ...

    </system.web>

    </configuration>

      如上的代码添加了一个名为connString 的 application-wide 设置,由connection string提供数据连接串的值。现在,你可以在这个
    网站的大部分ASP.NET网页中,用下面的语句读取 connString 这个参数的值:

      string connstr=ConfigurationSettings.AppSettings("connString")

      如果正在创建一个大型ASP.NET应用,比较明智的决定是将大量的网站全局管理、调整属性定义为 application-wide 参数。到目
    前为止,可以象刚才我们所作的那样使用 appSettings 标记。这里存在一个问题,别人想整合你的程序的时候,要是已经存在名称一
    样的配置,他将不得进行不修改大范围修改,使不产生冲突。这种情况要不要发生,就看你自己想把网站往哪方面做了。

      若要避免这种混乱,可在Web.config 文件中,把应用程序的设置“分组”为一个唯一的标记。也就是说可以在Web.config 文件
    中创建一个名为 <MyAppSettings> 的标记,然后再象我们前面所述那样简单地添加application-wide 的设置。为了在 Web.config 中
    自定义一个标记,必须先通过 <configSections> 标记,在Web.config 中明确的定义一个新的标记名称,例如:

    <configuration>

    <configSections>

    <section name="MyAppSettings"

    type="System.Configuration.NameValueFileSectionHandler,

    System, Version=1.0.3300.0, Culture=neutral,

    PublicKeyToken=b77a5c561934e089" />

    </configSections>

    ...

    </configuration>

    注意:

    在 <section ... /> 标记中的type属性值都必须写在同一行中,在这里换行是为了看起来更清晰。

    这个 <section ... /> 标记指明将添加一个自定义的名为 MyAppSettings 的标记。从现在开始,为了添加application-wide 参数,我们
    能在Web.config 文件中添加一个 <MyAppSettings> 标记和 <add ... /> 标记,如下所示:

    <configuration>

    <configSections>

    <section name="MyAppSettings"

    type="System.Configuration.NameValueFileSectionHandler,

    System, Version=1.0.3300.0, Culture=neutral,

    PublicKeyToken=b77a5c561934e089" />

    </configSections>

    <MyAppSettings>

    <add key="connString" value="connection string" />

    </MyAppSettings>

    ...

    </configuration>

      最后,为了在ASP.NET 的网页中,读取这个自定义的值,我们用如下的语法:

      ConfigurationSettings.GetConfig("MyAppSettings")("connString")

      更一般的做法是:把 MyAppSettings 替换为你选择用来存放自定义设置标记的名称;同时把 connString 替换为在自定义设置
    标记中,你希望读取的参数名称。通过这种方法,可以有效地解决上面提到的冲突,当然,特殊情况例外。

      在web.config文件中,<authentication>这一区段定义了服务器进行用户验证这一过程的细节。所支持的三种不同模式是
    Windows、Forms和Passport。现在我们来仔细看看每种模式:

    • Windows验证通过Windows的系统帐号来验证用户,例如活动目录(Active Directory)。Windows验证是最安全的验证形

      式,对于程序员来说这种模式是很简单的,因为整个过程都是由操作系统来处理的。但是,网站的每个用户都需要一个系
       
      统帐号,所以这种模式会被限制在企业内部网(intranet)的应用程序里。
    • Passport验证使用护照来验证用户,它是第二安全的验证方式。其最好的用武之地是大型的、活动的Internet电子商务应用程

                  序,这些程序会验证用户的服务使用费。这种模式是.NET所选择的验证方法。

    • Forms验证是安全性最低的验证方法,因为必须要由你的应用程序自己来处理验证过程。但是,这是最有可能在你Internet应

      用程序上使用的模式,因为它所需要的管理和维护是最少的。

      应用Forms验证的一个例子如下:


     文件目录为:

     +BIN
     +Admin
        -index.aspx
        - test.aspx
        - *.aspx
        - web.config //Admin文件夹下的web.config
     login.aspx
     web.config //根目录的web.config
     index.aspx 

     

    (-)FormsAuthentication的重要方法以及属性
    FormsCookieName
     返回用于当前应用程序的已配置 Cookie 名称。
    GetAuthCookie
     为给定的用户名创建身份验证 Cookie。这不会将 Cookie 设置为传出响应的一部分,因此应用程序对如何发出该 Cookie 有更多的
    控制权限。
    Authenticate
     给定所提供的凭据,尝试根据包含在已配置凭据存储区中的凭据对凭据进行验证。
    GetRedirectUrl
     返回导致重定向到登录页的原始请求的重定向 URL。
    HashPasswordForStoringInConfigFile
     给定标识哈希类型的密码和字符串,该例程产生一个适合存储在配置文件中的哈希密码。
    RedirectFromLoginPage
     将已验证身份的用户重定向回最初请求的 URL。
    {=========
    备注
    RedirectFromLoginPage 方法重定向到在查询字符串中指定的返回 URL 键。例如,在 URL
    http://www.contoso.com/login.aspx?
    ReturnUrl=caller.aspx
    中,caller.aspx 是 RedirectFromLoginPage 所重定向到的返回 URL。如果返回键不存在,则
     RedirectFromLoginPage 将重定向到 Default.aspx。
        =========}
    SetAuthCookie
     创建身份验证票并将其附加到 Cookie 的传出响应的集合。它不执行重定向。
    SignOut
     移除身份验证票.

    (二)让我们一步一步彻底明白页面是怎样验证的

    再次说明我们验证的目的:
     Admin文件夹是管理员进行后台管理的"专区",只有通过login.aspx登陆验证后才能进入Admin文件夹里面访问里面的所有页面,我们
    必须通过填写login.aspx的表单来验证用户是否是管理员.

    (1) 假设我们在根目录的index.aspx设置一个连接<a href=login.aspx>管理员登陆</a>,管理员可以通过这个连接,访问login.aspx进行填写
    表单.这里出现了一个奇妙的思维定势的问题,我们习惯这个"管理员登陆"连接来连接到login.aspx,其实在这里,我们错了,应该"直接"连
    接到Admin文件夹(或者里面的任何页面),有人问:"这岂不是普通访问者也可以通过这个连接直接连接到了Admin的页面了吗?",对!,这
    就是基于表单验证的美妙之处,不用担心这个问题,看看我们的2个web.config就明白了!

    看看Admin文件夹里面的web.config

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


    有一个<deny users="?"/>,就是说没有通过验证的匿名用户绝对禁止访问这个文件夹-Admin.
    那么,如果匿名用户真的这样做了(试图连接Admin文件夹里面的页面)会怎样呢?哈哈,会定向到login.aspx页面的,看看根目录的
    web.config

    <configuration>
     
    <system.web>
      
    <authentication mode="Forms">
       
    <forms name="mycookiename" loginUrl="login.aspx" protection="All" timeout="30">
       
    </forms>
      
    </authentication>
      
    <authorization>
       
    <allow users="*"/>
      
    </authorization>
     
    </system.web>
    </configuration>


    根目录的web.config设置了验证方式,以及相应的处理情况.
    <authentication mode="Forms">来设置了验证方式mode="Forms";
    <forms name="mycookiename" loginUrl="login.aspx" protection="All" timeout="30"/>
    看到了loginurl="login.aspx"了吗?就是说,如果匿名用户试图连接受保护的页面(Admin文件夹),则定向到login.aspx,来让这个匿名用户
    登陆!

    (2)我们点击了那个"管理员登陆"链接,来到了login.aspx.此时你会发现,URL地址其实是:login.asxp?ReturnUrl=admin/index.asp(其实就是
    我们所请求的页面),如果我们在login.asxp通过了验证,那么,页面会自动跳转到那个ReturnUrl.

    看看login.axp:

    <asp:textbox id=textname runat=server/>帐号
    <asp:textpassword id=textpassword runat
    =server>密码
    <asp:checkbox id=mycheckbox runat
    =server/>是否记住密码,永久登陆
    <asp:button runat=server onclick=btnloginclick text=登陆/>


    处理事件1(当用户点击登陆按钮时候)

    void btnloginclick(Object sender,EventArgs e)
    {
     
    if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool.

     {
     FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);
     }

    }

    1,FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);的作用:
    ->设置一个验证Cookie,说明用户已经通过验证.
    ->返回刚才您所请求的页面(Admin/index.aspx);
    2,这句话相当于这两句:
    FormsAuthentication.SetAuthCookie(UserName.Text,mycheckbox.Checked);
    Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text,mycheckbox.Checked);
    3,如果mycheckboxt控件已经选择,则,写入cookie,保存50年,当然,我们可以更改这个时间:
    处理事件1(当用户点击登陆按钮时候)

    void btnloginclick(Object sender,EventArgs e)
    {
     
    if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool.

     {
     HttpCookie authenticationCookie
    =
    FormsAuthentication.GetAuthcookie(UserName.Text,mycheckbox.Checked);
     authenticationCookie.Expires
    =DateTime.Now.AddDays(3);//3天

     Response.Cookies.Add(authenticationCookie);
     
     Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text,mycheckbox.Checked);
    }


    4,这里有个bug,我不知道为什么会这样,我们这样:
    处理事件1(当用户点击登陆按钮时候)

    void btnloginclick(Object sender,EventArgs e)
    {
     
    if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool.

     {
     FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);
     Response.Redirect(
    "http://www.QuickResponser.com"
    );
     }

    }


    会怎样呢?按理说应该执行FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);
    然后跳转到请求的页面admin/index.aspx.
    可是,在实际试验过程中,发现页面执行了Response.Redirect("
    http://www.QuickResponser.com");
    5,我们的链接不要涉及到直接连接到login.aspx,为什么?假设我们直接登陆login.asxp,那么这个URL就没有参数ReturnUrl,但是,默认是
    Default.aspx(或者index.axp....),当管理员通过验证时候,页面不是直接跳转到根目录的默认页面index.aspx.
    (如果直接连接的话,也是可以的,利用上面的bug解决)

    注销验证:
    用FormsAuthentication.SignOut();

    其实,上述方案并不是很安全的解决方案.只是很实用,简单,又比较安全的验证解决方案.

  • 相关阅读:
    F#周报2019年第40期
    F#周报2019年第39期
    F#周报2019年第38期
    python模块之time_random
    python小趣味_520绘制一个心形.
    python模块之json_pickle_shelve
    python基础17_列表推导式 vs 生成器表达式
    python基础16_闭包_装饰器
    Spark安装笔记
    python基础15下_迭代器_生成器
  • 原文地址:https://www.cnblogs.com/zxub/p/173507.html
Copyright © 2011-2022 走看看