Asp.net的身份验证之Forms身份验证 (三)

本文详细介绍了ASP.NET中的身份验证与授权配置方法,包括Windows和Forms身份验证的设置,以及如何通过配置文件实现用户和角色级别的权限控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、基于Windows的身份验证将<system.web>元素下的<authentication> 设置为 Windows;基于Forms的身份验证将<system.web>元素下的<authentication> 设置为 Forms。

2、基于Forms的身份验证时,设置<system.web>元素下的<authentication> 元素的 <forms> 子元素,示例如下,仅为说明
    <authentication mode="Forms">

      
<forms name=".VS2005_Form" loginUrl="~/Security/Login.aspx" defaultUrl="~/Default.aspx"
          protection
="All" timeout="30" path="/" requireSSL="false"
          slidingExpiration
="true" enableCrossAppRedirects="false"
          cookieless
="UseDeviceProfile">
      
</forms>

    
</authentication>

<forms>元素的属性说明如下
1) cookieless - 身份验证可以将 Forms 身份验证票存储在 Cookie 中也可以以无 Cookie 的表示形式存储在 URL 上。有效值如下:
  ·UseDeviceProfile - 默认值表示 ASP.NET 根据预先计算得到的浏览器配置文件来确定存储票证的位置。
  ·AutoDetect - 选项使 ASP.NET 动态确定浏览器是否支持 Cookie。
  ·UseUri - 强制实施无 Cookie 票证 
  ·UseCookies - 强制实施有 Cookie 票证。
2) defaultUrl - 指定在成功登录后,请求将重定向到的默认 URL。
3) domain - 指定包含 Forms 身份验证票的 HttpCookie 的 Domain 属性的值。显式设置此属性可使应用程序共享同一个 Cookie,前提是这些应用程序共享某个 DNS 命名空间的一个公共部分(例如,如果 domain 属性设置为“cnblogs.com”,则 webabcd.cnblogs.com 和 dudu.cnblogs.com可以共享一个 Cookie)。
4) enableCrossAppRedirects - Forms 身份验证允许以查询字符串变量或窗体 POST 变量的形式在应用程序之间传递 Forms身份验证票。将此属性设置为 true 可使 FormsAuthenticationModule 能够从查询字符串或窗体 POST 变量提取票证。
5) loginUrl - 指定未经身份验证的用户的请求将被重定向到的 URL。该 URL 可以在同一台计算机上或在远程计算机上。如果是在远程计算机上,则两台计算机上 machineKey 配置元素中的 decryptionkey 和 validationKey 属性都需要使用相同的值。
6) name - 用于身份验证的 HTTP Cookie 的名称。注意,如果多个应用程序需要在一台计算机上使用基于窗体的身份验证服务,并且每个应用程序都希望由应用程序隔离 Forms 身份验证 Cookie,则每个应用程序都应配置一个唯一的 Cookie 值。为避免在 URL 中产生依赖项,在设置身份验证 Cookie 时,ASP.NET 还使用“/”作为 Path 值,以便将这些 Cookie 发送回站点上的每个应用程序。
7) path - 用于发出的 Cookie 的路径。默认值为“/”,以避免路径中大小写不匹配的造成的困难,因为在返回 Cookie 时,浏览器是严格区分大小写的。共享服务器环境中的应用程序应使用此指令来维护专用 Cookie。(它们还可以使用 API 在运行时指定路径来发出 Cookie。)
8) protection - 用于保护 Cookie 数据的方法。有效值如下: 
  ·All - 同时使用数据验证和加密来保护 Cookie。所配置的数据验证算法是基于 <machinekey> 元素的。如果密钥足够长(48 个字符),默认情况下将使用 AES 进行加密。All 是默认(和建议)值。 
  ·None - 用于仅将 Cookie 用于个性化设置并且安全性要求不高的站点。加密和验证都可以被禁用。尽管以此方式使用 Cookie 需谨慎,但对于使用 .NET Framework 实现个性化设置的任何方法,此设置提供了最佳性能。 
  ·Encryption - 使用 AES、TripleDES 或 DES 加密 Cookie,但不对 Cookie 进行数据验证。这类 Cookie 容易受到精心选择的纯文本的攻击。
  ·Validation - 不加密 Cookie 的内容,但验证 Cookie 数据在传输过程中是否未被更改。若要创建 Cookie,验证密钥在缓冲区中与 Cookie 数据连接,并且计算出 MAC 并将其追加到输出的 Cookie。
9) requireSSL - 如果设置为 true,则 Forms 身份验证会设置 Forms 身份验证 Cookie 的安全位。兼容的浏览器只将 Cookie 通过 SSL 连接发送回 ASP.NET。注意,如果使用无 Cookie Forms 身份验证,则此设置无效。
10) slidingExpiration - 如果设置为 true,则 Forms 身份验证将定期更新 Forms 身份验证票的生存期。无论票证是包含在 Cookie 中,还是以无 Cookie 的格式包含在 URL 中,都会进行此操作。
11) timeout - 时间量(以整数分钟为单位),经过该时间量之后,Cookie 则会过期。默认值是 30。超时属性是一个可调值,从收到上次请求的时间开始计算,它将在 n 分钟后过期。为了避免对性能产生负面影响,也为了避免那些打开了 Cookie 警告的应用程序产生多个浏览器警告,Cookie 在超时时间过半时更新。(这意味着在某些情况下可能会出现精度损失。) (注意:createPersistentCookie为true的话,则该属性失效,过期时间将为50年)

3、授权用户和角色设置<system.web>元素下的<authorization>元素,示例如下,仅为说明
<authorization>
    
<allow VERB="POST" users="webabcd@gmail.com" />
    
<allow roles="admin" />
    
<deny users="*" />
    
<allow VERB="GET" users="abc,xyz" />
    
<deny users="?" />
</authorization>

注:可以把授权用户和角色设置的配置写在某个文件夹内,则所做的配置只作用于该文件夹内,自动继承外面的配置。
allow - 允许
deny - 拒绝
users - 用户(多用户用逗号隔开)
roles - 角色(多角色用逗号隔开)
verb - 指定http方法,post或get
* - 所有用户
? - 匿名(未经过身份验证的)用户

4、分路径设置授权用户和角色设置,示例如下,仅为说明
    <location path="folder">
        
<system.web>
            
<authorization>
                
<deny users="?"/>
                
<allow users="*"/>
            
</authorization>
        
</system.web>
    
</location>
    
    
<location path="abc.aspx">
        
<system.web>
            
<authorization>
                
<allow roles="Administrators" />
                
<deny users="*"/>
            
</authorization>
        
</system.web>
    
</location>

<location>元素的path属性可以是文件夹也可以是某一文件

5、<membership>元素设置,示例如下,仅为说明
    <membership defaultProvider="SqlMembershipProvider">
      
<providers>
        
<clear/>
        
<add name="SqlMembershipProvider"
             type
="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName
="SqlConnectionString"
             enablePasswordRetrieval
="false"
             enablePasswordReset
="true"
             requiresQuestionAndAnswer
="false"
             applicationName
="/"
             requiresUniqueEmail
="false"
             passwordFormat
="Hashed"
             maxInvalidPasswordAttempts
="3"
             minRequiredPasswordLength
="3"
             minRequiredNonalphanumericCharacters
="0"
             passwordAttemptWindow
="10"
             passwordStrengthRegularExpression
="" />
      
</providers>
    
</membership>

enablePasswordRetrieval - 是否可以检索用户密码(总是false)
enablePasswordReset - 是否允许用户重置其密码
requiresQuestionAndAnswer - 是否要求在创建用户时提供密码提示问题和答案
applicationName - 自定义成员资格提供程序的应用程序的名称
requiresUniqueEmail - 电子邮件地址是否必须是唯一的
passwordFormat - 存储的密码的格式
maxInvalidPasswordAttempts - 指定允许的无效密码或无效密码提示问题答案尝试的次数。当无效尝试的次数达到配置的值时,将锁定该成员资格用户
minRequiredPasswordLength - 密码所要求的最小长度
minRequiredNonalphanumericCharacters - 有效密码中必须包含的最少特殊字符数
passwordAttemptWindow - 跟踪失败的尝试所用的时间(以分钟为单位)。每当发生另一次失败时都将重置窗口。如果达到了允许的无效密码或密码提示问题答案的最大尝试次数,将锁定成员资格用户
passwordStrengthRegularExpression - 用于验证密码的正则表达式

6、<roleManager>元素设置,示例如下,仅为说明
    <roleManager defaultProvider="SqlRoleProvider"
      enabled
="true"
      cacheRolesInCookie
="true"
      cookieName
=".VS2005_Role"
      cookieTimeout
="30"
      cookiePath
="/"
      cookieRequireSSL
="false"
      cookieSlidingExpiration
="true"
      cookieProtection
="All">
      
<providers>
        
<add
          
name="SqlRoleProvider"
          type
="System.Web.Security.SqlRoleProvider"
          connectionStringName
="SqlConnectionString"
          applicationName
="/" />
      
</providers>
    
</roleManager>

各属性详细说明参看MSDN,索引处查找“roleManager 元素”

7、使用加密密码
<authentication>
    
<credentials passwordFormat="SHA1" >
        
<user name="Mary" password="94F85995C7492EEC546C321821AA4BECA9A3E2B1"/>
        
<user name="John" password="5753A498F025464D72E088A9D5D6E872592D5F91"/>
    
</credentials>
</authentication>

使用FormsAuthentication.HashPasswordForStoringInConfigFile(String password, String passwordFormat)生成密码
Clear - 密码以明文形式存储
SHA1 - 密码存储为 SHA1 摘要
MD5 - 密码存储为 MD5 摘要

8、使用用户帐户模拟,在<system.web>元素下加如下元素
<identity impersonate="true" username="" password="" />
ASP.NET Forms验证 实现子域名(SubDomain)共享登陆 http://www.cnblogs.com/Medi-Bruce/archive/2010/01/17/1650027.html 一、什么是单点登录    单点登录就是在多个web应用程序中,实现统一登录方式,一但登录了某web应用程序,其它相关联的web应用程 序都无需再次登录,一个地方退出,所有相关联的web应用程序都退出. 二、通过利用ASP.NET Forms验证模式 可以实现子域名(SubDomain)共享登陆下的缺陷 要利用Asp.NET Form验证模式实现 同一主域下不同子域名共享登陆状态需要进行以下配置 配置Web.config 1.Asp.net的认证模式改为Forms认证模式,domain 要等于你的应用程序对应的域名,例如: .test.cn <authentication mode="Forms"> <forms name=".ASPNETFORM" domain=".test.cn" loginUrl="/login.aspx" defaultUrl="/default.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" /> </authentication> 2.配置针对存储在cookie中的票据信息进行加密解密的方式 <machineKey validationKey="CF10047DB84FBA7F418BF30F9697B1D6EDDA3A90837F3C57B336B4016E47986135B31B2432F7CB20A6858DFFB E4E5ECD1451E17C91830993445D0EA5708BABBD" decryptionKey="5D37DDB652B86956" validation="SHA1"/> 备注:生成machineKey网址     http://www.aspnetresources.com/tools/keycreator.aspx 登陆创建验证票据 1.应用程序登陆页面(Login.aspx)输入用户名、密码并验证通过后,创建一张加密过的验证票据,并存储在cookie中 //创建验证票 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddDays(1d), false, HttpContext.Current.Request.UserHostAddress ); string authTicket = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, authTicket); cookie.Domain = ConfigurationManager.AppSettings["SSODomain"]; HttpContext.Current.Response.Cookies.Add(cookie); 2.登陆完毕后进入有权限的页面,并可得到验证通过后的ID User.Identity.Name; if (!User.Identity.IsAuthenticated) { //未登录 Response.Redirect("/login.aspx"); } string name = User.Identity.Name; 3.登出页面,清空用户信息,并销毁票据 HttpContext.Current.Session.Clear(); FormsAuthentication.SignOut(); Forms验证 实现子域名(SubDomain)共享登陆下的缺陷 根据以上讲解,均可实现同一主域名下的多个子域名共享登陆状态,但是主域名有所限制,当主域名为1个字母,而后缀为2个字母的域名,不能通过认证,例如:a.cn域名,a.jp域名 均不能实现子域名共享登陆,而其他域名均能实现,例如:a.test.com, a.sina.cn 等,大家亦可通过修改hosts文件试验一下,如有高手知道怎么解决这个问题的,请指教,谢谢!!并附上 Demo程序 ,请大家指教! PS:因本人公司的域名为p.cn,想通过Form认证的模式实现子域名共享登陆状态,但是死活用不上!~~!!汗,不知道这个算不算微软的Bug。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值