>
•
PrincipalPermission 请求
•
命令性(嵌入方法的代码内) PrincipalPermission permCheck = new PrincipalPermission(
null, @"DomainName\WindowsGroup");
permCheck.Demand();
•
声明性(属性位于接口、类和方法之前) [PrincipalPermission(SecurityAction.Demand,
Role=@"DomainName\WindowsGroup)]
•
明确的角色检查。您可以使用 IPrincipal 接口执行角色检查。 IPrincipal.IsInRole(@"DomainName\WindowsGroup");
•
Enterprise Services (COM+) 角色。可以使用 ContextUtil 类以编程方式执行角色检查。 ContextUtil.IsCallerInRole("Manager")
何时使用
使用 Windows 身份验证和模拟的情况:
•
应用程序的用户已经有了可以由服务器验证的 Windows 帐号。
•
您需要将原调用者的安全性上下文传递到 Web 应用程序的中间层和/或数据层以支持细分(每用户)授权。
•
您需要将原调用者的安全性上下文传递到下游各层以支持操作系统级审核。
在应用程序中使用模拟之前,确保将此方法与使用受信任的子系统模型进行比较,了解此方法的优缺点。“身份验证和授权”一章中的“授权方式”章节中的“选择资源访问模式”详细阐述了这些内容。
模拟的缺点包括:
•
由于无法对数据库连接进行池处理,因而降低了应用程序的可扩展性。
•
由于需要给各个用户配置后端资源的 ACL,因而增加了管理工作。
•
委派需要 Kerberos 身份验证和进行适当配置的环境。
更多信息
•
有关 Windows 身份验证的详细信息,请参见本章后面的“Windows 身份验证”。
•
有关模拟的详细信息,请参见本章后面的“模拟”。
•
有关 URL 授权的详细信息,请参见本章后面的“URL 授权注意事项”。
•
有关 Enterprise Services (COM+) 角色的详细信息,请参见“Enterprise Services Security一章。
不带模拟的 Windows 身份验证
下列配置元素显示了如何在Web.config.中明确声明启用不带模拟功能的 Windows(IIS) 身份验证。 <authentication mode="Windows" />
<!-- The following setting is equivalent to having no identity element -->
<identity impersonate="false" />
可配置的安全性
当您使用不带模拟的 Windows 身份验证时,可以使用以下授权选项:
•
WindowsACL
•
客户端请求的资源。ASP.NET FileAuthorizationModule 对映射到 ASP.NET ISAPI 的请求文件类型执行访问检查。它使用原调用者的访问令牌和附加到请求资源的 ACL 以便执行访问检查。模拟不是必需选项。
对于静态文件类型(没有映射到 ISAPI 扩展),IIS 使用调用者的访问令牌和附加到文件的 ACL 执行访问检查。
•
应用程序访问的资源。根据 ASP.NET 进程标识,在应用程序所访问的资源(文件、文件夹、注册表项和 Active Directory 对象)上配置 Windows ACL。
•
URL 授权。在 Web.config 中配置 URL 授权。在 Windows 身份验证中,用户名采用 DomainName\UserName 格式,并且角色与 Windows 组 一 对应。 <authorization>
<deny user="DomainName\UserName" />
<allow roles="DomainName\WindowsGroup" />
</authorization>
程序安全性
可以使用下列编程安全选项:
•
主体权限要求
•
命令性 PrincipalPermission permCheck = new PrincipalPermission(
null, @"DomainName\WindowsGroup");
permCheck.Demand();
•
声明性 [PrincipalPermission(SecurityAction.Demand,
Role=@"DomainName\WindowsGroup")]
•
明确的角色检查。您可以使用IPrincipal 接口执行角色检查。 IPrincipal.IsInRole(@"DomainName\WindowsGroup");
何时使用
使用不带模拟的 Windows 身份验证的情况:
•
应用程序的用户已经有了可以由服务器验证的 Windows 帐户。
•
需要使用固定标识来访问下游资源(例如数据库)以便支持连接池。
更多信息
•
有关 Windows 身份验证的详细信息,请参见本章后面的“Windows 身份验证”。
•
有关 URL 授权的详细信息,请参见本章后面的“URL 授权注意事项”。
使用固定标识的 Windows 身份验证
Web.config 中的 <identity> 元素支持可选的用户名和密码属性,这样,您就可以为应用程序配置特定的固定标识以进行模拟。这显示在以下配置文件片段中。 <identity impersonate="true"
userName="registry:HKLM\SOFTWARE\YourSecureApp\
identity\ASPNET_SETREG,userName"
password="registry:HKLM\SOFTWARE\YourSecureApp\
identity\ASPNET_SETREG,password" />
这个例子显示了 <identity> 元素,其中凭证在注册表中使用 aspnet_setreg.exe 工具进行加密。明文形式的 userName 和 password 属性值被指向安全的注册表项和包含加密凭证的命名值的指针所替代。有关这个工具的详细信息及下载方式,请参见 Microsoft 知识库中的文件 Q329290 “HOWTO:Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings”。
何时使用
当在运行 Windows 2000 的服务器上使用 .NET Framework 1.0 时,不建议使用固定的模拟标识。因为这需要您授予 ASP.NET 进程帐户“充当操作系统的一部分”权限,这个权限很大。 ASP.NET 进程需要这个权限,因为它使用您所提供的凭证执行 LogonUser 调用。
注 .NET 框架 1.1 版将在 Windows 2000 上提供此方案的改进版本。凭证将由 IIS 进程执行,这样 ASP.NET 就不需要“充当操作系统的一部分”权限了。
窗体身份验证
以下配置元素显示了如何在 Web.config 中以声明方式启用窗体身份验证。 <authentication mode="Forms">
<forms loginUrl="logon.aspx" name="AuthCookie" timeout="60" path="/">
</forms>
</authentication>
可配置的安全性
在使用窗体身份验证时,可以使用以下授权选项:
•
WindowsACL
•
客户端请求的资源。请求的资源需要 ACL 以允许对匿名 Internet 用户帐户进行读取访问。(在使用窗体身份验证时,应该将 IIS 配置为允许匿名访问)。
无法使用 ASP.NET 文件授权,因为它需要 Windows 身份验证。
•
应用程序访问的资源。根据 ASP.NET 进程标识,在应用程序所访问的资源(文件、文件夹、注册表项和 Active Directory 对象)上配置 Windows ACL。
•
URL 授权
在 Web.config 中配置 URL 授权。在窗体身份验证中,用户名的格式取决于自定义数据存储、SQL Server 数据库或 Active Directory。
•
如果使用的是 SQL Server 数据存储,则为: <authorization>
<deny users="?" />
<allow users="Mary,Bob,Joe" roles="Manager,Sales" />
</authorization>
•
如果使用 Active Directory 作为数据存储,则以 X.500 格式显示用户名和组名: <authorization>
<deny users="someAccount@domain.corp.yourCompany.com" />
<allow roles ="CN=Smith James,CN=FTE_northamerica,CN=Users,
DC=domain,DC=corp,DC=yourCompany,DC=com" />
</authorization>
程序安全性
可以使用下列编程安全选项:
•
主体权限要求
•
命令性 PrincipalPermission permCheck = new PrincipalPermission(
null, "Manager");
permCheck.Demand();
•
声明性 [PrincipalPermission(SecurityAction.Demand,
Role="Manager")]
•
明确的角色检查。您可以使用 IPrincipal 接口执行角色检查。 IPrincipal.IsInRole("Manager");
何时使用
窗体身份验证最适合于 Internet 应用程序。如果出现以下情况,则应该使用窗体身份验证:
•
应用程序用户没有 Windows 帐户。
•
您希望用户通过使用 HTML 窗体输入凭证的方式登录到应用程序。
|