ASP.NET安全

来源:互联网 发布:淘宝空间在哪里找 编辑:程序博客网 时间:2024/06/02 06:19

ASP.NET安全

ASP.NET技术2008-05-17 21:09:04 阅读38评论0   字号: 订阅

身份验证
ASP.NET身份验证包括三种基本的验证方式,分别是Windows身份验证、Forms身份验证以及Passport身份验证
授权
授权决定了是否应该授予某个标识对特定资源的访问资源。在ASP.NET中,有两种方式来授予给定资源的访问权限:
文件授权:文件授权由FileAuthorizationModule执行。它检查.aspx或.asmx处理程序文件的访问控制列表(ACL)以确定用户是否应该具有对文件的访问权限。ACL权限用于验证用户的Windows标识或ASP.NET进程的Windows标识。
URL授权:URL授权由UrlAuthorizationModule执行,它将用户和角色映射到ASP.NET应用程序中的URL。这个模块可用于有选择地允许或拒绝特定用户或角色对应用程序的任意部分的访问权限。
1 Windows身份验证
在ASP.NET应用程序中,Windows身份验证将Microsoft Internet信息服务(IIS)所提供的用户标识视为已经过身份验证的用户。IIS提供了大量用于验证用户标识的身份验证机制,其中包括匿名身份验证、Windows集成的NTLM身份验证、Windows集成的Kerberos身份验证、基本(base64)身份验证、摘要式身份验证以及基于客户端证书的身份验证。
(1) Windows身份验证的配置:Windows身份验证是ASP.NET应用程序的默认身份验证机制,并被标识为使用authentication配置元素的应用程序的身份验证模式。
<system.web>
 <authentication mode="Windows" />
</system.web>
(2) Windows身份验证的方式:Windows身份验证主要有两种通常的使用方式,分别是直接使用Windows用户作为网站的登录用户和使用模拟用户Windows标识。
当使用第一种方式,即直接将Windows用户作为认证用户的时候,在ASP.NET中,使用WindowsAuthenticationModule模块来实现Windows身份验证。该模块根据IIS所提供的凭据构造一个WindowsIdentity对象,并将该标识设置为该应用程序的当前User属性值。若要启用该种身份验证的模式,除了按照上一节中配置文件的配置方法配置之后,还需要配置IIS网站的认证属性。配置方法如下:单击“开始”->“程序”->“管理工具”->“Internet信息服务”命令,打开“Internet信息服务(IIS)管理器”对话框。在应用程序的站点下面,右键单击该网站,在快捷菜单中选择“属性”命令,打开“站点属性”对话框,选择“目录安全性”选项卡,然后在“身份验证和访问控制”区域,单击“编辑”按钮,选择“集成Windows身份验证”,取消“启用匿名访问”。
当使用第二种认证方式,即模拟认证方式的时候,如果网站有匿名用户进行访问,网站会根据该配置方式,自动将模拟认证方式的用户附加到该匿名用户上,这样使得该用户具有了访问网站的权限。默认情况下,此模拟的Windows标识是ASP.NET进程的标识用户。在Microsoft Windows 2000和Windows XP Profesional上,此标识是ASP.NET辅助进程的用户标识,即本地ASP.NET帐户。在Windows 2003上,此标识是ASP.NET应用程序所属的IIS应用程序池的标识。默认情况下,此标识是NETWORK SERVICE帐户。若要为网站启用该模拟匿名的方式,需要将网站的配置文件配置成如下形式:
<system.web>
 <authentication mode="Windows" />
 <identity impersonate="true" />
</system.web>
2 Forms身份验证
通过Forms身份验证,可以使用所创建的登录窗体验证用户的用户名和密码。未经过身份验证的请求被重定向到登录页,用户在该页上提供凭据和提交窗体。如果应用程序对请求进行了验证,系统会颁发一个凭据,该凭据包含用于重建后续请求的标识的密钥。Forms身份验证提供了一种方法,可以使用自己的代码对用户进行身份验证,然后将身份验证标记保留在Cookie或页的URL中。Forms身份验证通过FormsAuthenticationModule参与ASP.NET页的生命周期。可以通过FormsAuthentication类访问Forms身份验证信息和功能。
如果要使用Forms身份验证,可以创建一个登录页。该登录页即收集用户的凭据,又包括验证这些凭据时所需的代码。如果这些凭据有效,可以调用FormsAuthentication类的方法,以便使用适当的身份验证凭据将请求重定向到最初请求的资源。如果不需要进行重定向,只需获取Forms身份验证Cookie或对其进行设置即可。使用authentication配置元素对Forms身份验证进行配置。最简单的情况是,在web.config文件或单独的文件中,可以通过指定URL将未经身份验证的请求重定向到某个登录页,并提供有效的凭据。下面的示例演示配置文件的一部分。该配置文件为Authenticate方法指定了登录页和身份验证凭据。密码已经使用HashPasswordForStoringInConfigFile方法进行加密:
<authentication mode="Forms">
 <forms name="SavingsPlan" loginUrl="/Logon.aspx">
  <credentials passwordFormat="SHA1">
   <user name="Kim" password="07B7F3EE06F278DB966BE960E7CBBD103DF30CA6" />
   <user name="John" password="BA56E5E0366D003E98EA1C7E04ABF8FCB3753889" />
  </credentials>
 </forms>
</authentication>
成功通过身份验证之后,FormsAuthenticationModule模块将会使用经过身份验证的用户信息填充当前的User属性。下面的代码示例演示如何以编程方式读取经过Forms身份验证的用户的标识:
String userName=User.Identity.Name;
如果需要使用Forms身份验证模式,应在配置文件中首先定义启用该身份验证方式:
<system.web>
 <authentication mode="Forms" />
  <forms loginUrl="logon.aspx" name=".ASPXFORMSAUTH" />
 </authentication>
 <authorization>
  <deny users="?" />
 </authorization>
</system.web>
Forms身份验证数据的获取:如果网站启用了Forms身份认证的模式,在通常的开发中,程序需要获取登录人员的基本信息,若要实现这些信息的获取,开发人员可以通过调用FormsAuthentication类,使用该类的方法和属性获取Forms身份认证的相关信息。
    Forms认证信息的公共方法
 方法名称    说明
 Authenticate   给定提供的凭据,尝试验证已配置凭据存储区的凭据
 Decrypt    在给定从HTTP Cookie获得的加密身份验证凭据的情况下,返回FormsAuthenticationTicket类的
     一个实例
 Encrypt    在给定FormsAuthenticationTicket的情况下,生成包含适用在HTTP Cookie中的加密身份验证
     凭据的字符串
 GetAuthCookie   检索加密的身份验证Cookie。此Cookie不添加到Cookies集合中
 HashPasswordForStoringInConfigFile 在给定密码和标识哈希类型的字符串的情况下,生成适合存储在配置文件中的哈希密码
 Initialize   通过读取配置设置并获取当前应用程序的Cookie值和加密值,来初始化FormsAuthentication类
 RedirectFromLoginPage  将已通过身份验证的用户重定向到最初请求的URL
 RenewTicketIfOld  更新FormsAuthenticaqtionTicket上的发出日期和时间以及过期日期和时间
 SetAuthCookie   创建身份验证凭据并将它附加到传出响应的Cookie集合
 SignOut    通过将身份验证Cookie或URL文本设置为空值来移除身份验证凭据。这将移除持久性的Cookie和
     会话Cookie
    Forms认证信息的公共属性
 属性名称    说明
 FormsCookieName   获取当前应用程序的Cookie名称
 FormsCookiePath   获取当前应用程序的Cookie路径
 CookiesSupported  获取一个值,该值指示应用程序是否已配置为支持无Cookie Forms身份验证
 CookieMode   获取一个值,该值指示是否已对应用程序配置了无Cookie Forms身份验证
 CookieDomain   获取Forms身份验证Cookie的域的值
 DefaultUrl   获取在未指定重定向URL时Forms身份验证将重定向到的URL
 LoginUrl   获取Forms身份验证将重定向到的登录页的URL
 RequireSSL   获取一个值,该值指示是否启用弹性过期时间
 SlidingExpiration  获取一个值,该值指示是否启用弹性过期时间
 EnableCrossAppRedirects  获取一个值,该值指示当Forms身份验证凭据未存储在Cookie中时,是否可以将通过身份验证的
     用户重定向到其他Web应用程序中的URL
3 Passport身份验证
Passport身份验证是由Microsoft提供的集中身份验证服务,该服务为成员站点提供单一登录和核心配置文件服务。Passport之所以让用户受益匪浅,原因在于用户不必登录访问受到限制的新资源或站点。如果希望站点与Passport身份验证及授权兼容,则应该使用该身份验证的方式。
工作方式:
Passport是基于Cookie的身份验证服务。使用Passport身份验证的工作方式如下:
(1) 客户端向受到保护的资源(如http://www.DemoSite.com/default.aspx)发出HTTP GET请求。
(2) 检查客户的Cookie是否具有现有的Passport身份验证凭据。如果站点找到有效的凭据,则站点对该客户进行身份验证。如果请求不包括有效的身份验证凭据,则服务器返回状态302并将客户重定向到Passport登录服务。响应在查询字符串中包含一个URL,该URL被发送到Passport登录服务以便将客户定向回原始站点。
(3) 客户端执行重定向操作,再向Passport登录服务器发出HTTP GET请求,然后传输来自原始站点的查询字符串信息。
(4) Passport登录服务器向客户提供登录窗体。
(5) 客户端填写窗体,并使用安全套接字层(SSL)将POST发送回登录服务器。
(6) 登录服务器对用户进行身份验证并将客户重定向回原始URL(http://www.DemoSite.com/default.aspx)。响应在查询字符串中包含一个加密的Passport Cookie。
(7) 客户端遵循重定向并再次请求原始的受保护资源,这一次使用Passport Cookie。
(8) 起始服务器上的PassportAuthenticationModule会检测是否存在Passport Cookie,并测试身份验证。如果成功,则该请求通过身份验证。
配置Passport身份验证:通过.NET Passport网站,可以对.NET Passport SDK进行下载、安装和配置。必须完成注册表单才能获得SDK。Windows Server 2003包括.NET Passport SDK,不需要执行此步骤。配置Passport身份验证的代码如下所示:
<authentication mode="Passport" />
使用Passport文档和.NET Passport SDK功能,实现Passport身份验证和授权。
Passport身份验证相关接口
Passport身份验证提供程序使用PassportAuthenticationModule模块为ASP.NET应用程序提供围绕.NET Passport服务的包装。该模块提供Passport身份验证服务,可以根据.NET Passport服务提供的身份验证信息将当前的User属性设置为PassportIdentity对象。PassportIdentity对象提供一个到Passport配置文件信息的接口,以及各种用于对Passport身份验证凭据进行加密和解密的方法。
    PassportIdentity对象的公共方法
 方法名称    说明
 AuthUrl    返回包含成员的登录服务器URL的字符串,以及在查询字符串中发送到登录服务器的可选信息
 AuthUrl2   返回包含成员的登录服务器URL的字符串,以及在查询字符串中发送到登录服务器的可选信息
 Compress   压缩数据
 CryptIsValid   获取指示Passport管理器是否处于可用以加密的有效状态的标志的状态
 CryptPutHost   设置用于Passport加密和解密的密钥
 CryptPutSite   通过引用在首次安装密钥时分配给该密钥的站点名称标签,设置用于Passport加密和解密的密钥
 Decompress   及压缩通过Compress方法压缩的数据
 Decrypt    使用当前站点的Passport参与者密钥对数据进行解密
 Encrypt    使用当前站点的Passport参与者密钥对数据进行加密
 GetCurrentConfig  获取HKLM/SW/Mircosoft/Passport配置单元下的注册表项的内容
 GetDomainAttribute  通过向Passport管理器查询所请求的域属性来提供Passport域的信息
 GetDomainFromMemberName  返回成员名称字符串中的Passport域
 GetIsAuthenticated  指示成员是否由Passport机构进行身份验证
 GetLoginChallenge  使用户登录,方法是将适当的标头输出到302重定向URL,或者启动识别Passport的客户端身份
     验证交换
 GetOption   获取特定的Passport登录选项
 GetProfileObject  返回指定配置文件属性的Passport配置文件信息
 HasFlag    指示在该用户配置文件中是否设置了给定的标志
 HasProfile   指示在该用户配置文件中是否存在给定的配置文件属性
 HaveConsent   指示在该用户配置文件中是否授予了完全许可
 LoginUser   使用户登录,方法是生成302重定向URL,或者启动识别Passport的客户端身份验证交换
 LogoTag    返回一个HTML段落,它包含用于Passport链接的HTML<img>标记
 LogoTag2   返回一个HTML段落,它包含用于Passport链接的HTML<img>标记
 LogoutURL   返回Passport注销URL字符串
 SetOption   设置特定的Passport登录选项
 SignOut    从当前会话中注销给定的Passport成员
 Ticket    获取有关Passport身份验证凭据的特定属性的信息
    PassportIdentity对象的公共属性
 属性名称    说明
 AuthenticationType  获取用于标识用户的身份验证的类型
 Error    获取一个值,该值指示与当前Passport凭据相关联的错误状态
 GetFormNetworkServer  获取有关Passport服务器连接和查询字符串的信息
 HasSavedPassword  获取有关是否已保存Passport成员的密码的信息
 HasTicket   获取一个值,该值指示查询字符串是否包括作为Cookie的Passport凭据
 HexPUID    获取当前已验证身份的用户的Passport唯一标识符(PUID,以十六进制格式表示)
 IsAuthenticated   获取一个值,该值指示用户是否已由Passport机构进行了身份验证
 Item    获取Passport配置文件属性
 Name    获取当前用户的名称
 TicketAge   获取自从发出或刷新最后一个凭据以来所经过的时间(以秒为单位)
 TimeSinceSignIn   获取从成员登录到Passport登录服务器以来经过的时间(以秒为单位)

网站授权
授权决定了是否应授予某个标识对特定资源的访问权限。在ASP.NET中,有两种方式来授予对给定资源的访问权限:分别是文件授权和URL授权
1 文件授权:文件授权实际上就是采用的Windows身份验证中,模拟用户的授权方式。当网站的配置文件中指定了如下代码所示的方式:
<configuration>
 <system.web>
  <identity impersonate="true" userName="DemoSite/Test" password="E@1bp4!T2" />
 </system.web>
</configuration>
该配置表示,当匿名用户访问该网站的时候,默认采用的账户是DemoSite域或者工作组中的Test用户权限。由于该用户属于网站下的用户,所以可以针对该用户进行对某写文件和文件夹的各个访问权限的控制,可以通过操作系统中对应的权限设置属性,如设置某一文件夹是否对该用户是只读还是完全控制的权限,来控制网站中启用该模拟用户的匿名用户权限。
2 URL授权
通过URL授权,可以显式地允许或拒绝某个用户或角色对特定目录的访问权限。若要启用URL授权,需要在该目录的配置文件中创建一个authorization节,并且在authorization节中的allow或deny元素中指定一个用户或角色列表。为目录建立的权限也会应用到其子目录,除非子目录中的配置文件从写这些权限。authorization节的语法如下所示:
<authorization>
 <[allow|deny] usersrolesverbs />
</authorization>
allow或deny元素是必需的。必须指定users或roles属性,也可以同时包含二者,verbs属性可选。allow和deny元素分别授予访问权限和撤消访问权限。每个元素都支持以下表中的属性:
    URL授权元素说明
 元素名称    说明
 users    标识此元素的目标身份(用户账户)。用问号(?)标识匿名用户。可以用星号(*)指定所有经过
     身份验证的用户     
 roles    为被允许或被拒绝访问资源的当前请求标识一个角色(RolePrincipal)对象
 verbs    定义操作所要应用到的HTTP谓词,如GET、HEAD和POST。默认值为“*”,它指定了所有谓词
下面的示例中对Test1标识和Admins角色的成员授予访问权限,对Test2标识(除非Admins角色中包含Test2标识)和所有匿名用户拒绝访问权限:
<authorization>
 <allow users="Test1" />
 <allow roles="Admins" />
 <deny users="Test2" />
 <deny users="?" />
</authorization>
下面的authorization演示如何允许Test3标识的访问权限并拒绝所有其他用户的访问权限:
<authorization>
 <allow users="Test3" />
 <deny users="*" />
</authorization>
可以使用逗号分隔的列表为users和roles属性指定多个实体,如下面的示例所示:
<allow users="Test4, Test5, DemoSite/Test6" />
下面的示例允许所有用户对某个资源执行HTTP GET请求,但是只允许Test7标识执行POST操作:
<authorization>
 <allow verbs="GET" users="*" />
 <allow verbs="POST" users="Test7" />
 <deny verbs="POST" users="*" />
</authorization>

原创粉丝点击