转载三篇关于 Web.config 的 Authorization 节点配置的文章

文章一、WebConfig Authorization 节点

授权的目的是确定是否应该授予某个标识对给定资源请求的访问权限类型。有两种基本方式来授予对给定资源的访问权限:

  • 文件授权

文件授权由 FileAuthorizationModule 执行,它在使用 Windows 身份验证时处于活动状态。它执行 .aspx  .asmx 处理程序文件的访问控制列表 (ACL) 检查以确定用户是否应该具有访问权限。应用程序可以进一步使用模拟在正在访问的资源上进行资源检查。

  • URL 授权

URL 授权由 URLAuthorizationModule 执行,它将用户和角色映射到 URL 命名空间的块上。此模块实现正和负两种授权断言。也就是说,对于某些集、用户或角色,该模块可用于有选择地允许或拒绝对 URL 命名空间的任意部分的访问。

URLAuthorizationModule 在任何时候都是可用的。只需在配置文件的 <authorization> 部分的 <allow>  <deny> 元素中放置用户和/或角色的列表即可。

若要建立访问特定目录的条件,则必须将一个包含 <authorization> 部分的配置文件放置在该目录中。为该目录设置的条件也会应用到其子目录,除非子目录中的配置文件重写这些条件。此部分的常规语法如下所示。

<[element] [users] [roles] [verbs]/>

元素是必需的。必须包含 users 或 roles 属性。可以同时包含二者,但这不是必需的。verbs 属性是可选的。

允许的元素有 <allow> 和 <deny>,它们分别授予和撤消访问权限。每个元素支持三个属性,这些属性在下面的表中定义。

属性

说明

roles

标识此元素的目标角色。请求所关联的 IPrincipal 对象确定角色成员。可以将任意 IPrincipal 对象附加到给定请求的上下文中,这些对象可通过您喜欢的任何方式来确定角色成员。例如,默认的 WindowsPrincipal 类使用 Microsoft Windows NT 组来确定角色成员。

users

标识此元素的目标身份。

verbs

定义操作所要应用到的 HTTP 谓词,如 GETHEAD 和 POST

还会拒绝匿名用户。

以下示例向 Kim 和管理角色的成员授予权限,而拒绝 John 和所有匿名用户:

<authorization>

    <allow users="Kim"/>

    <allow roles="Admins"/>

    <deny users="John"/>

    <deny users="?"/>

</authorization>

用户和角色都可以通过使用逗号分隔的列表来引用多个实体,如下面的示例所示。

<allow users="John, Kim, contoso\Jane"/>

注意,域帐户 (contoso\Jane) 必须同时包括域和用户名的组合。

除身份名称外,还有两种特殊身份,如下表所示。

标识

说明

*

指所有身份

?

指匿名身份

若要允许 John 并拒绝其他任何人,可以构造下面的配置部分。

<authorization>

    <allow users="John"/>

    <deny users="*"/>

</authorization>

下面的示例允许每个人使用 GET,但只有 Kim 可以使用 POST

<authorization>

    <allow verb="GET" users="*"/>

    <allow verb="POST" users="Kim"/>

    <deny verb="POST" users="*"/>

</authorization>

使用下面的试探法应用规则:

  • 位于较低目录级别的配置文件中包含的规则优先于位于较高目录级别的规则。系统通过构造一个 URL 的所有规则的合并列表,其中最近(层次结构中距离最近)的规则位于列表头,来确定哪条规则优先。
  • 给定 URL 的一组合并的规则,系统从列表头开始,检查规则直到找到第一个匹配项为止。注意,ASP.NET 的默认配置包含向所有用户授权的 <allow users="*"> 元素。如果没有匹配的规则,则将允许请求,除非另外拒绝。如果找到匹配项并且匹配项是 <deny> 元素,则它将返回 401 状态代码。应用程序或站点可以方便地配置位于其站点或应用程序顶层的<deny users="*"> 元素以防止此行为。

如果是 <allow> 匹配,则模块不执行任何操作,允许进一步处理请求。

还有 <location> 标记,您可以使用该标记来指定特定的文件或目录,由该标记环绕(即在 <location> 和 </location> 标记之间)的那些设置将应用到该文件或目录。

文章二、Config 配置 authorization deny allow

<authorization >
     <deny users = "?" />
     <allow users= "*" />
</authorization >

?:匿名用户,也就是没有登入的用户不能访问。

*:所有用户,所有用户都不能访问。

<deny users = "?"/>、 是拒绝匿名用户访问

<allow users= "*" /> 允许所有的用户访问包括匿名用户

<authentication mode="Forms" >
     <forms name=".ASPXAUTH" loginUrl="~/login.aspx" > </forms >
       <!-- 默认cookie 名 及登陆页面地址  -->
   </authentication >
   <authorization >
     <deny users="?" > </deny > <!-- 禁止匿名访问  -->
   </authorization >

<location path="Default.aspx" > <!--允许所有人访问这个页面-->
     <system.web >
       <authorization >
         <allow users="*" />
       </authorization >
     </system.web >
   </location >

自定义票据

// 自定义票据,获取用户的roles,写到票据中。票据会携带在cookie中。
           FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
               1,                                         // version
               loginID,                               // user name
               DateTime.Now,                               // creation
               DateTime.Now.AddMinutes(60 * 20),               // Expiration
               false,                                     // Persistent
               "");                               // userData

           String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
           HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
           Response.Cookies.Add(authCookie);

文章三、关于 <authorization> 中 <deny users="?"> 和 <allow users="*">

<authorization >
   <deny users = "?" />
   <allow users= "*" />
</authorization >

如果以上面的效果显示,那么用户访问站点下的其他页,如果没有登录的话,都会转到登录页。

但是要是把 <allow users= "*" /> 放到 <deny users = "?"/> 前面,在没有登录的情况下,可以随意访问其他页面,没有限制。这是什么工作机制?对顺序也有要求吗?

运行时,授权模块从最本地的配置文件开始,循环访问 allow 和 deny 元素,直到它找到适合特定用户帐户的第一个访问规则。然后,该授权模块根据找到的第一个访问规则是 allow 还是 deny 规则来允许或拒绝对 URL 资源的访问。默认的授权规则为 <allow users="*"/>。因此,默认情况下允许访问,除非另外配置。

所以应该把适用用户群最小的放在最前面。

我来说一说

怎么记匿名和所有用户(包含匿名用户)的符号:匿名用 ?,一个问号,表示在问“你谁呀?不认识,快登录!”;所有用户(包含匿名用户)用 *,这个大家通配符常用的,不复杂。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值