RSS

导航







快速搜索

高级搜索 »

注意:此页面是Enterprise Library 3.1 中文帮助的一部分。


编辑

1 - 安全应用程序块介绍

Microsoft Enterprise Library 安全应用程序块帮助开发人员实现应用程序中与授权相关的功能。应用程序可以使用安全应用程序块以支持授权,然后缓存用户的授权和授权数据。与 Microsoft .NET Framework 2.0 的特性一起,开发人员可以方便的实现常见的安全相关的功能。

安全应用程序块有下面的特性

  • 减少了编写重复代码以完成标准任务的需求。
  • 有助于维护在应用程序中和企业间一致的安全实践。
  • 通过跨越提供的多范围的功能的一致的架构模型来简化开发人员的学习曲线。
  • 提供了可用来解决觉应用程序安全问题的实现。
  • 可扩展,支持定制安全提供程序的实现。

常见场景

开发人员经常编写必须授权用户的应用程序,应用程序使用一种或多种安全提供程序,如 Microsoft 活动目录服务、授权管理、活动目录应用程序模型(ADAM)和定制的授权提供程序。这些应用程序可能还需要为登录会话期间缓存授权和授权数据。

安全应用程序块通过以一样的风格处理它们来简化这些任务,从特定安全提供程序中抽象应用程序的代码。可以通过修改配置来修改底层提供程序,而不需要修改底层的代码。

安全应用程序块提供了将在下面的场景中帮助你的代码:
  • 授权
  • 缓存安全相关的证书

示例应用程序代码

下面的代码展示了如何决定用户是否被授权以执行任务。

C#
IPrincipal principal = new GenericPrincipal(new GenericIdentity("Username"), new string[]{"Manager"});

IAuthorizationProvider ruleProvider = AuthorizationFactory.GetAuthorizationProvider("RuleProvider");

// Determine whether user is authorized for the rule defined as "Print Document".
bool authorized = ruleProvider.Authorize(principal, "Print Document"); 

Visual Basic
Dim principal As IPrincipal = New GenericPrincipal(New GenericIdentity("Username"), New String() {"Manager"})

Dim ruleProvider As IAuthorizationProvider = AuthorizationFactory.GetAuthorizationProvider("RuleProvider")

' Determine whether user is authorized for the rule defined as "Print Document".
Dim authorized As Boolean = ruleProvider.Authorize(principal, "Print Document") 

读者需求

此指南的目标读者是软件架构和软件开发人员。要从此指南中获得完整的好处,将需要理解下面的技术:
  • Microsoft Visual Studio 2005 开发系统(任何下面的版本):
    • Visual Studio 2005 专业版
    • Visual Studio 2005 团队系统版
    • Visual Studio 2005 标准版
  • .NET Framework version 2.0

系统需求

下面是安全应用程序块的需求:

  • Microsoft Windows XP Professional, Windows Server 2003, 或 Windows Vista 操作系统
  • Microsoft .NET Framework 2.0
  • Microsoft Visual Studio 2005 开发系统(任何下面的版本):development system (any of the following editions):
    • Microsoft Visual Studio 2005 标准版
    • Microsoft Visual Studio 2005 专业版
    • Microsoft Visual Studio 2005 软件开发人员团队版
    • Microsoft Visual Studio 2005 软件测试人员团队版
    • Microsoft Visual Studio 2005 软件架构师团队版
    • Microsoft Visual Studio 2005 团队套件

注意:安全应用程序块授权管理器提供程序需要授权管理器和 AzMan primary interop 程序集。授权管理器被包含在 Microsoft Windows 2000 Server SP4 和 Microsoft Windows Server 2003 中。可以通过安装 Windows Server 2003 管理工具包来在 Microsoft Windows XP 中安装授权管理器。关于如何安装和使用授权管理器和 primary interop 程序集的信息,请参见 How To: Use Authorization Manager (AzMan) with ASP.NET 2.0

安全应用程序块的依赖

安全应用程序块依赖于 Enterprise Library 中的下列代码:
  • 内核库功能。Enterprise Library 内核提供了如度量和配置这样的服务,并且是所有 Enterprise Library 应用程序块的共享依赖。内核库功能被包含在程序集 Microsoft.Practices.EnterpriseLibrary.Common.dll 中。
  • ObjectBuilder 子系统ObjectBuilder 子系统完成所有重复的、必要的用于创建和销毁对象实例的任务,同时提供了调试的灵活性。Enterprise Library 将 ObjectBuilder 子系统用于如注入配置到程序块类中以及连接度量类到应用程序块中等任务。ObjectBuilder 子系统被包含在程序集 Microsoft.Practices.ObjectBuilder.dll 中。

基于对安全应用程序块特殊功能的需要,可能还需要下列在 Enterprise Library 中的应用程序块:
  • Caching 应用程序块。安全应用程序块使用缓存应用程序块来缓存安全信息,然后在需要的时候获取它。可以用自己的缓存提供程序替换缓存应用程序块。依赖于如何配置缓存应用程序块,可能还需要数据访问应用程序块。更多信息,请参见缓存应用程序块文档。

修改安全应用程序块配置设置的推荐方法是使用 Enterprise Library 配置控制台。

安全应用程序块文档

和介绍一起,文档包含了下列主题:

  • 安全应用程序块的设计。此主题解释了应用程序块设计中的决定以及那些决定后的相关事物。
  • 用安全应用程序块开发应用程序。此主题解释了如何下载和安装应用程序块,以能在应用程序中使用它。它被他为多个小节。在第一小节:输入配置信息中,示范了如何配置应用程序块以完成常见的任务。下一个子节:关键场景中,示范了如何使用应用程序块完成绝大多数典型的安全操作。
  • 扩展和修改安全应用程序块。此主题解释了如何通过创建自己的提供程序扩展应用程序块和如何修改源代码。
  • 部署和操作。此主题解释了如何部署和更新应用程序块程序集,包括与配置有关的信息。
  • 快速入门。此主题解释了如何安装和配置快速入门应用程序,还包含了一系列示范如何将常见安全操作添加到应用程序中的漫游。

更多信息,请参见下面的模式和实践指南:
顶部

编辑

1.1 - 场景和目标

安全应用程序块为解决开发人员在编写需要安全功能的应用程序所面对的绝大多数任务而设计。这些任务根据场景进行了组织。每个场景都给出了一个真实世界情况的示例,如认证一个用户;讨论了情况所需要的安全功能;并展示了完成任务的代码。

根据场景组织这些任务的目的是给代码一些上下文。与展示一组孤立方法,而没有它们最好被使用在哪儿的意义不同,场景提供了用于代码的设置,将它放到对许多应用程序必须使用安全特性的开发人员来说熟悉的条件中。

场景如下:

  • 获取用于已认证用户的临时凭证
  • 使用凭证认证用户
  • 终止用户会话(凭证过期)
  • 决定用户是否被授权执行任务

关于这些场景的更多信息,请参见关键场景。

何时使用安全应用程序块

安全应用程序块包含了下列功能的实现:
  • 授权
  • 安全相关的缓存和会话管理

如果应用程序需要已提供的实现,就可以使用应用程序块来提供这些功能。然而,应用程序块也被设计成为具有扩展性并包含用于每个功能的通用提供程序。还可以适配提供程序以满足自己的安全需求。

注意:如果使用安全应用程序块缓存安全相关的信息,用于安全缓存的默认缓存存储提供程序是缓存应用程序块。尽管缓存应用程序块可以被配置为加密在后端存储中的缓存数据,但应用程序块不支持保存在内存中的缓存数据的加密。如果攻击者危及计算机并访问进程的内存时,他或她就可以访问到保存在缓存中的信息。如果此威胁对应用程序来说很重要,就要避免在缓存中保存如信用卡号码或者密码这样的敏感信息,或者使用另一种支持内存内加密的缓存存储提供程序。

顶部

编辑

2 - 用安全应用程序块开发应用程序

此主题描述了可以如何使用安全应用程序块来开发应用程序。它首先解释了如何配置应用程序块,并将它添加到应用程序中。然后,在关键场景中,它解释了如何将应用程序块用于特定的场景,如授权用于特殊任务的用户。本主题假定使用的是原始状态的、没有扩展的应用程序块。(要学习如何添加功能,请参见扩展安全应用程序块。)

所有应用程序块都以源代码形式发布,所以在使用快速入门和配置工具前必须编译。要学习如何编译 Enterprise Library 源代码,请参见构建 Enterprise Library 。

顶部

编辑

2.1 - 输入配置信息

这些过程解释了如何配置安全应用程序块。与节点关联的属性会显示在右面板中。

添加安全应用程序块

  1. 打开配置文件。更多信息,请参见配置应用程序块。
  2. 右单击应用程序配置,指向 New ,然后单击 Security Application Block
  3. 单击 Security Application Block 节点。
  4. 在右面板中,如果需要,设置 DefaultAuthorizationInstance 属性。如果在代码中没有指定,将使用此授权实例。默认为 none
  5. (可选的)在右面板中,设置 DefaultSecurityCacheInstance 属性。如果在代码中没有指定时将使用此安全缓存实例。默认为 none
  6. 右单击 Authorization 节点,指向 New ,然后单击 AuthorizationRuleProviderAzMan Provider 或者 CustomRuleProvider

配置 AzMan 提供程序

  1. (可选的)在右面板中,输入 Application 的名称。默认为 Application
  2. 输入 AuditIdentifierPrefix。这是在审计标识符之前的前缀。格式是前缀用户名:操作。默认的前缀为 AzManAuthorizationProvider
  3. 输入 Name。这是节点的名称。默认为 AzManProvider
  4. (可选的)输入 Scope。使用范围,可以有用于应用程序不同部分的不同授权设置。
  5. 输入 StoreLocation。这是授权存储的位置。可以是一个 XML 或者活动目录的一部分。用于 XML 文件的默认位置是 msxml://c:/myAuthStore.xml 。用于活动目录的默认值是:msldap://myserver/CN=MyStore,OU=AzMan,DC=MyDomain,DC=Com。

配置定制授权提供程序

  1. 在右面板中,单击 Attributes 属性。
  2. 单击右面板中 Attributes 属性节中的省略号按钮(…)
  3. EditableKeyValueCollectionEditor 对话框中,单击 Add 添加新的名称/值对。
  4. EditableKeyValueCollectionEditor 对话框中的右面板中,输入键名和属性的值。
  5. 适当的添加更多的名称/值对,然后单击 OK
  6. 在配置控制台右面板中的 Name 属性节中,修改授权提供程序的名称。默认的名称为 CustomAuthorizationProvider
  7. 在右面板中,单击 Type 属性。
  8. 单击右面板中 Type 属性节中的省略号按钮(…) 。如果想要的类型没有包含在 Assemblies 文件夹中,单击 Type Selector 中的 LoadAssembly 以查找包含所需类型的程序集。

如果使用的是 Authorization Rule Provider,就不得不输入授权的规则。授权规则指定了用户被授权以执行某些任务下的环境。表达式必须是一个带有布尔谓词的字符串。配置控制台包含了一个可以用来创建规则的 Rule Expression Editor。使用编辑器,可以输入标识、角色和布尔操作符。

下面是可用的标识:

  • 特定的(例如:“Bob”)
  • 匿名的(符号为“?”)
  • 所有的(符号为“*”)

可用的角色如下:

  • 特定的(例如:“Managers”)
  • 所有的(符号为“*”)

可用的操作符如下:

  • AND
  • OR
  • NOT
  • (
  • )

这些标识符、角色和操作符组成规则,可以是简单的也可以是复杂的。规则的示例如下:

  • I:Bob。这个规则指明了只有带有标识 Bob 的用户才被授权。
  • ((R:HumanResources OR R:GeneralManagers) AND (NOT R:HRSpecialist))。这个规则指出了只有包含在 HumanResources 或者 GeneralManagers 角色中,且不包含在 HRSpecialist 角色中的用户才被授权。

Rule Expression Editor 还包括了使用指定的规则测试用户是否还有特定角色或者已授权的标识的特性。这对帮助确认规则措辞的正确性是很有用的。要使用此特性,输入用于测试规则的角色或者要测试的标识,然后单击 Test 按钮。 Expression Editor 将显示 Authorized 或者 Not Authorized,或者它将显示一条错误信息以指出规则定义不正确。

下面的过程展示了如何配置 Authorization Rule Provider。

配置 Authorization Rule Provider

  1. 单击 RuleProvider 节点。
  2. (可选的)在右面板中,修改节点的名称。默认名称为 RuleProvider
  3. 要添加一个规则,右单击 RuleProvider 节点,指向 New ,然后单击 Rule
  4. 在右面板中,单击 Expression 属性。
  5. 单击省略号按钮(…)。使用 Rule Expression Editor 输入授权规则。
  6. (可选的)在右面板中,修改规则的名称。默认名称为 Rule

可以使用安全缓存来存储安全相关的信息。下面的过程描述了如何配置安全缓存。

选择安全缓存

  1. 右单击 SecurityCache 节点,指向 New ,单击 CachingStoreProvider 或者 CustomStoreProvider。缓存存储提供程序使用缓存应用程序块做为安全缓存。
  2. 如果选择的是 CachingStoreProvider,将自动添加缓存应用程序块。更多信息,请参见缓存应用程序块文档。

下面二个过程描述了如果配置 Caching Store Provider 和 Custom Cache Provider。

配置 Caching Store Provider

  1. 设置 AbsoluteExpiration 属性。这是用于添加到缓存中的条目的过期时间量。时间的单位是分钟,默认值为 60
  2. 设置 CacheManager 属性。这是此缓存应用程序块实例的名称。如果需要,可以通过输入一个新的名称或者从下拉列表框中选择一个名称来修改名称。默认为 none
  3. (可选的)修改 Name 属性。这是节点的名称。默认为 CachingStoreProvider
  4. 设置 SlidingExpiration 属性。这是从缓存中的条目最后一次被访问的时间与到期之间的间隔。单击为分钟,默认为 10

配置 Custom Cache Provider

  1. (可选铁)设置 Attributes 属性。
  2. 在右面板中的 Attribures 属性的节中,单击省略号按钮 (…)
  3. EditableKeyValueCollectionEditor 对话框中,单击 Add 添加新的名称/值对。
  4. EditableKeyValueCollectionEditor 对话框的右面板中,输入键的名称和属性的值。
  5. 适当的添加更多的名称/值对,然后单击 OK
  6. 修改 Name 属性(可选的)。默认值是 CustomCacheProvider
  7. 单击 Type 属性。单击省略号按钮 (…) 。如果想要的类型没有包含在 Assemblies 文件夹中,单击 Type SelectorLoadAssembly 以查找包含所要的类型的程序集。

顶部

编辑

2.1.1 - 安全应用程序块的源模式

此主题列出了配置安全应用程序块的 XML 元素和属性。可以手工编辑 XML 数据,但 Enterprise Library 配置控制台极大的简化了此任务。如果选择手工编辑 XML ,请使用包含在本主题中的模式信息。

配置文件有下面的节处理程序声明。

<configSections>
  <section name="securityConfiguration" 
type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, 
Microsoft.Practices.EnterpriseLibrary.Security, Version=3.1.0.0, Culture=neutral, 
PublicKeyToken=null" />
</configSections>

节处理程序声明包含了配置设置节的名称和处理在那节中数据的节处理程序类的名称。配置设置节的名称为 securityConfiguration。节处理程序类的名称为 Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettingsMicrosoft.Practices.EnterpriseLibrary.Security

securityConfiguration 元素

securityConfiguration 元素指定了安全应用程序块的配置,此元素是必须的。

属性和子元素

下面的节描述了 securityConfiguration 元素的属性和子元素。

属性

表 1 列出了 securityConfiguration 元素的属性。

表 1:securityConfiguration 的属性
属性描述
defaultAuthorizationInstance如果在代码中没有指定,将使用的授权实例,此属性是可选的。
defaultSecurityCacheInstance如果在代码中没有指定,将使用的安全缓存实例。此属性是可选的。

authorizationProviders 子元素 authorizationProviders 元素是 securityConfiguration 元素的一个子元素。它列出了由应用程序使用的授权提供程序。此元素不是必须的。

add 子元素

add 元素是 authorizationProvider 元素的一个子元素。add 元素添加授权提供程序的名称。此元素是可选的,可以有多个 add 元素。

属性

表 2 列出了 add 元素的属性。

表 2 :add 的属性
属性描述
name授权提供程序的名称。名称必须在节中唯一。此属性是必须的。
type派生自 AuthorizationProvider 类的类的类型名。此属性是必须的。
storeLocation授权存储、活动目录或者 XML 文件的位置。此属性应用于 AzManAuthorizationProvider 类。此属性是必须的。
application授权管理器(AzMan)应用程序的名称。此属性应用于 AzManAuthorizationProvider 类。它是可选的。
scope用于 AzMan 应用程序范围的可选多咱我。此属性应用于 AzManAuthorizationProvider 类。它是可选的。
auditIdentifierPrefix追加到生成的审计标识的审计标识前缀。此属性应用于 AzManAuthorizationProvider 类。此属性是必须的。

rules 子元素

rules 元素是 add 元素的子元素。它列出了用于提供程序的授权规则。此元素应用于 AuthorizationRuleProvider 类。它是必须的。

add 子元素

add 元素是 rules 元素的一个子元素。它添加一个规则。此元素应用于 AuthorizationRuleProvider 类。它是可选的,可以有多个 add 元素。

属性

表 3 列出了用于 add 元素的属性。

表 3:add 的属性
属性描述
name规则的名称。此属性应用于 AuthorizationRuleProvider 类。名称在节内必须唯一。此属性是必须的。
expression授权规则。此属性应用于 AuthorizationRuleProvider 类。表达式必须是一个带有布尔谓词的字符串。此属性是必须的。

securityCacheProviders 子元素

securityCacheProviders 元素是 securityConfiguration 元素的一个子元素。它列出了可以被应用程序使用的安全缓存提供程序。此元素是可选的。

add 子元素

add 元素是 securityCacheProviders 元素的一个子元素。add 元素添加安全缓存提供程序的名称。此元素是可选的。可以有多个 add 元素。

属性

表 4 列出了用于 add 元素的属性。

表 4:add 的属性
属性描述
name安全缓存提供程序的名称。名称在节中必须是唯一的。此属性是必须的。
type派生自 CachingStoreProvider 类的类的类型名。此属性是必须的。
defaultSlidingSessionExpirationInMinutes这意味着添加到缓存中的安全信息将在缓存条目从最后一次访问时经过指定的时间后过期。默认值为 10 分钟。
defaultAbsoluteSessionExpirationInMinutes这意味着添加到缓存中的安全信息将从条目添加的时候开始经过指定的时间后过期。默认时间为 60 分钟。

顶部

编辑

2.2 - 添加应用程序代码

安全应用程序块为支持绝大多数用于授权和安全信息缓存的场景。在添加应用程序代码时,参考在关键场景节中的场景,然后选择最匹配你的情况的场景。原样使用场景中的代码或者根据需要修改它。

首先,必须准备应用程序以使用安全应用程序块。

准备应用程序

  1. 添加到安全应用程序块程序集的引用。在 Visual Studio 中,右单击解决方案中的项目节点,然后单击添加引用。单击浏览标签,然后导航到 Microsoft.Practices.EnterpriseLibrary.Security.dll 程序集的位置。选择程序集,然后单击 OK 添加引用。
  2. 按照同样的过程,设置到 Enterprise Library 通用程序集:Microsoft.Practices.EnterpriseLibrary.Common.dllObjectBuilder 程序集:Microsoft.Practices.EnterpriseLibrary.ObjectBuilder.dll 的引用。
  3. 如果打算使用安全缓存,就要设置到程序集 Microsoft.Practices.EnterpriseLibrary.Security.Cache.CachingStore.dll 的引用。还需要添加到数据访问应用程序块程序集 Microsoft.Practices.EnterpriseLibrary.Data.dll 的引用,如果在配置控制台中使用 DatabaseCacheStorage 选项的话。
  4. (可选的)要不用全路径名称的方式使用来自安全应用程序块的元素,可以添加下列 using 语句(C#)或者 Imports 语句(Visual Basic)到源代码文件的顶部。下面代码展示如何添加这些用于 Microsoft.Practices.EnterpriseLibrary.Security 命名空间的语句。

C#
using Microsoft.Practices.EnterpriseLibrary.Security;

Visual Basic
Imports Microsoft.Practices.EnterpriseLibrary.Security

注意:对于 Visual Basic 项目,可以使用项目设计器的引用页来管理引用和导入命名空间。要访问引用页,在解决方案浏览器中选择项目节点,在项目菜单中单击属性。在项目设计器出现时,单击引用标签。

顶部

编辑

3 - 关键场景

此主题描述了开发人员在应用程序中提供安全功能时必须解决的绝大多数常见情况。每个场景都解释了任务、描述了真实世界可能发生的情况、还包含了示范如何使用安全应用程序块完成任务的代码。场景如下:

  • 为已授权的用户获取临时凭证。此场景说明了如何使用 SaveIdentity 方法缓存已授权的标识,然后返回一个临时凭证,凭证可做为用户会话期间的另一个用户证书。也可以使用此技术来保存用户的安全主体或者用户标识。
  • 使用凭证认证用户。此场景说明了在提供了一个有效的凭证时,如何使用 GetIdentity 方法返回已缓存的标识。同样的技术还可以用于获取用户的安全主体或者用户配置。
  • 终止用户会话(终止凭证)。此场景说明了在用户会话结束时,如何使用 ExpireIdentity 方法终止与一个标识对应的凭证。也可以使用此技术终止用户安全主体或者用户设置。
  • 决定用户是否被授权执行某个任务。此场景说明了如何使用 AuthorizationFactory 类的 GetAuthorizationProvider 方法获取一个授权提供程序,以及如何使用返回的授权提供程序的 Authorize 方法完成授权。

顶部

编辑

3.1 - 获取用于已认证用户的临时凭证

可能要为已认证的用户获取临时凭证的一个示例是,通过传递凭证来代替在单一用户会话期间频率的认证同样的凭证来提高应用程序的性能。也可以使用在此描述的方法保存用户安全主体和用户标识。

典型目标

在此场景中,目的是为用户传递已授权用户的标识到缓存中,然后获取与标识对应的凭证。

解决方案

声明变量保持凭证和缓存。通过调用 SecurityCacheFactory 中的 GetSecurityCacheProvider 认证用户并初始化安全缓存。调用 CachingStoreProviderSaveIdentity 方法,它保存标识信息并返回一个凭证。

快速入门

如何使用 SaveIdentity 方法获取用于已认证用户的凭证的扩展示例,请参见漫游:获取已认证用户的临时凭证。

使用 SaveIdentity

下面的方法展示了如何使用 SaveIdentity 方法。

C#
ISecurityCacheProvider cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");

// Cache the identity. The SecurityCache will generate a token that is then
// returned to us.
IToken token = cache.SaveIdentity(new GenericIdentity("Username"));

Visual Basic
Dim cache As ISecurityCacheProvider = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider")

' Cache the identity. The SecurityCache will generate a token that is then
' returned to us.
Dim token As IToken = cache.SaveIdentity(New GenericIdentity("Username"))

使用说明

另一种方法是,可以使用 SavePrincipal 或者 SaveProfile 来获取安全主体(principal)或者设置(profile)。每个这些对象都可以用同样的凭证组织到一起。

顶部

编辑

3.2 - 用凭证认证用户

可能要使用临时凭证来认证的示例是,通过传递凭证代替在单一用户会话期间频率认证来提高应用程序的性能。

典型目标

在此场景中,目标是使用凭证做为使用证书的另一种选择。

解决方案

调用在安全缓存对象中的 GetIdentity 方法,指定在标识初始缓存时创建的凭证。

快速入门

对于如何使用 GetIdentity 方法获取用户标识的扩展示例,请参见漫游:用凭证认证用户。

使用 GetIdentity

下面的代码展示了如何使用 GetIdentity 方法。

C#
ISecurityCacheProvider cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");

// Cache the identity. 
IToken token = cache.SaveIdentity(new GenericIdentity("Username"));

// Retrieves the identity previously saved by using the corresponding token.
IIdentity savedIdentity = cache.GetIdentity(token);

Visual Basic
Dim cache As ISecurityCacheProvider = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider")

' Cache the identity. The SecurityCache will generate a token which is then
' returned to us.
Dim token As IToken = cache.SaveIdentity(New GenericIdentity("Username"))

' Retrieves the identity previously saved by using the corresponding token.
Dim savedIdentity As IIdentity = cache.GetIdentity(token)

使用说明

另一种用法是,可以使用 GetPrincipal 或者 GetProfile 方法来获取用户的安全主体(principal)或者用户的设置(profile)。

顶部

编辑

3.3 - 终止用户会话(终止凭证)

要终止凭证的一个例子是用户注销以确保凭证不会被攻击者所使用。也可以使用在此描述的方法终止用户的安全主体或者用户的标识。

典型目标

在此场景中,目标是确保与用户标识对应的凭证被终止。

解决方案

调用安全缓存对象上的 ExpireIdentity 方法。

快速入门

对于如何使用 ExpireIdentity 方法终止用户标识对应的凭证的扩展示例,请参见漫游:终止用户会话。

使用 ExpireIdentity

下面的代码展示了如何使用 ExpireIdentity 方法。

C#
ISecurityCacheProvider cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");

// Cache the identity. 
IToken token = cache.SaveIdentity(new GenericIdentity("Username"));

// Expire the identity.
cache.ExpireIdentity(token);

Visual Basic
SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider")

' Cache the identity. 
Dim token As IToken = cache.SaveIdentity(New GenericIdentity("Username"))

' Expire the identity.
cache.ExpireIdentity(token)

使用说明

另一种方法是,可以使用 ExpirePrincipal 或者 ExpireProfile 方法移除与来自缓存中的凭证关联的安全主体(principal)或者设置(profile)信息。

顶部

编辑

3.4 - 决定用户是否已授权执行任务

常见的安全任务是授权用户执行任务。

典型目标

在此场景中,必须决定用户被授权以执行任务的时间,基于用户标识、角色信息以及任何指定的授权规则。

解决方案

获取用于用户的标识、角色和规则信息。为用户创建 GenericPrincipal 对象。通过调用 AuthorizationFactory 的静态方法 GetAuthorizationProvider 来创建授权提供程序。调用授权提供程序的 Authorize 方法。

快速入门

对于如何使用 AuthorizationRuleProviderAuthorize 方法来决定用户是否授权执行某个任务的扩展示例,请参见漫游:决定用户是否已授权执行任务。

使用 Authorize

下面的代码展示了如何使用 Authorize 方法。

C#
IPrincipal principal = new GenericPrincipal(new GenericIdentity("Username"), new string[]{"Manager"});

IAuthorizationProvider ruleProvider = AuthorizationFactory.GetAuthorizationProvider("RuleProvider");

// Determine whether user is authorized for the rule defined as "Print Document".
bool authorized = ruleProvider.Authorize(principal, "Print Document"); 

Visual Basic
Dim principal As IPrincipal = New GenericPrincipal(New GenericIdentity("Username"), New String() {"Manager"})

Dim ruleProvider As IAuthorizationProvider = AuthorizationFactory.GetAuthorizationProvider("RuleProvider")

' Determine whether user is authorized for the rule defined as "Print Document".
Dim authorized As Boolean = ruleProvider.Authorize(principal, "Print Document") 

使用说明

安全应用程序块被设计以使用 AzManAuthorizationProvider 或者 AuthorizationRuleProvider。使用授权请求,支持用于授权的上下文环境。通常,这是访问请求或者请求执行一个活动。

顶部

编辑

4 - 安全应用程序块的设计

安全应用程序块解决了下面几个方面:
  • 授权
  • 安全相关的缓存

设计目标

应用程序块被设计为获得下列目标:

  • 提供简单的、直观的,经常需要的授权功能接口。
  • 封装了用于执行授权和安全相关缓存的逻辑。
  • 现有的用于授权和安全相关缓存的标准提供程序。
  • 确保应用程序块是可扩展的。
  • 确保这只有最少或者微小的性能影响,相对于手工编写完成同样功能的安全代码而言。
  • 加入用于应用程序安全的最佳实践,就像在 Improving Web Application Security: Threats and Countermeasures中描述的那样。

设计亮点

安全应用程序块设计为具体化授权的实现和来自运行的应用程序的缓存提供程序。此设计让你可以不修改应用程序的代码就可以更改实现。图 1 说明了安全应用程序块中关键类之间的关系。

图 1 :安全应用程序块的设计

图 1 :安全应用程序块的设计


顶部

编辑

4.1 - 用于简化授权的设计

标准实现可以使代码易于理解、更加可预知、以及易于维护。然而,开发人员可以在应用程序中以许多不同的方式实现授权。例如,可能使用验证组织安全策略的方法。另一种情况是,可能使用满足特定部门或者应用程序本身需要的方法。

安全应用程序块将执行授权的操作封装到仅有少量方法的单一接口中。这些方法可被不同的授权提供程序使用。这意味着使用安全应用程序块的应用程序在授权用户执行任务的方式是一样的。通过使用安全应用程序块,这种一致性可以在单个项目、多个项目或者企业范围解决方案间保持。

设计内涵

下面关于安全应用程序块的设计的描述确保它将简化开发人员在应用程序中实现授权的方法。

  • 应用程序块定义了可以用于不同授权提供程序的接口。此接口仅暴露了少量开发人员需要理解的方法。
  • 应用程序块包含用于授权提供程序的通用实现。

下面的节描述了这些决定是如何在安全应用程序块中实现的。

使用有限数量方法的通用接口

安全应用程序块定义了一个单一的接口,接口封装了执行常见授权任务所需要的逻辑。此接口名为 IAuthorizationProvider,它只有一个名为 Authorize 的方法。下面的代码展示了 Authorize 方法的签名。

C#
bool Authorize(IPrincipal principal, string context); 

Visual Basic
Function Authorize(ByVal principal As IPrincipal, ByVal context As String) As Boolean 

IPrincipal 对象表示了以用户的名义运行代码的安全上下文。此对象包含了用户的标识,标识由 IIdentity 接口的实现所定义,以及用户属于的任何角色。第二个参数指定为授权提供程序的字符串。

包含通用的提供程序

应用程序块包含了二个授权提供程序接口的实现。AuthorizationRuleProvider 实现验证在配置控制台中使用 Rule Expression Editor 创建的规则的表达式。规则是包含凭证和值的字符串。在配置应用程序使用 AuthorizationRuleProvider 时,Authorize 方法接收一个规则名做为上下文参数。

应用程序块还包含了 AzManAuthorizationProvider。这个提供程序在计算机中安装授权管理器。(关于安装授权管理器的信息,请参见安全应用程序的介绍)。在配置应用程序使用 AzManAuthorizationProvider 时,Authorize方法接收操作或者任务做为上下文参数。

顶部

编辑

5 - 修改和扩展安全应用程序块

在安全应用程序块的初始状态中,它可以很好的工作于典型的数据访问场景中。然而,可能许多时候你需要定制应用程序块的某些行为以更好的适应你的应用程序特定的需求。在此有二种方法来完成它:扩展和修改。

扩展安全应用程序块

可以通过指派扩展点来扩展应用程序块。通常,是由你编写的自定义类,它实现一个特定接口或者派生自抽象类。因为这些类存在于应用程序的空间中,所有不需要修改或者重新生成应用程序块。而是使用配置设置来指派扩展。

现在,可能通过创建除由应用程序块提供的提供程序之外的新的提供程序来扩展应用程序块,通过实现应用程序块的接口。为了帮助创建自定义的提供程序,应用程序块提供了通用的提供程序,可以用来做为自己功能的基础。

修改安全应用程序块

可以通过修改应用程序块的源代码来修改应用程序块。这可能或者不可能需要相关配置的改变。因为修改作用于源代码,所以在修改起作用之前必须重新生成应用程序块。还必须准备处理支持和版本问题。要学习更多,请参见修改安全应用程序块。

顶部

编辑

5.1 - 扩展安全应用程序块

安全应用程序块设计为可用于不同的应用程序,并成为一个通用的应用程序块。扩展点允许适配应用程序块以满足任何特殊应用程序的需要。可以通过添加定制的应用程序块来扩展程序块的能力。

创建授权提供程序

这个过程描述了如何创建一个定制的授权提供程序类。代码示例展示了可以用于类的基础的框架。

创建一个授权提供程序类

  1. 创建一个派生自 AuthorizationProvider 类的新类。
  2. 添加类属性 ConfigurationElementType。指定类型 CustomAuthorizationProviderData 做为属性的参数。
  3. 创建授受 NameValueCollection 类型的参数的构造函数。
  4. 实现 Authorize 方法。Authorize 方法包含了用于自定义处理的授权逻辑。在方法完成时,如果用户被授权则返回 true ,否则如果用户没有被授权就返回 false

下面的代码示例是一个骨架授权提供程序类。

C#
[ConfigurationElementType(typeof(CustomAuthorizationProviderData))]
public class MyAuthorizationProvider : AuthorizationProvider
{
  public MyAuthorizationProvider(NameValueCollection configurationItems)
  {
  }
  public override bool Authorize(IPrincipal principal, string context)
  {
    // Implement the authorization logic here.
  }
}

Visual Basic
<ConfigurationElementType(GetType(CustomAuthorizationProviderData))> _
Public Class MyAuthorizationProvider
  Inherits AuthorizationProvider

  Public Sub New(ByVal ignore As NameValueCollection)

  End Sub


  Public Overrides Function Authorize (ByVal principal As IPrincipal, ByVal context As String) As Boolean
  ' Implement the authorization logic here.
  End Function

End Class

顶部

编辑

5.2 - 修改安全应用程序块

安全应用程序块被设置为用于授权和安全相关的缓存。然而,如果要添加新的特性到应用程序块,就可以通过修改源代码来进行(应用程序块包括源代码和二进制)。在这种情况下,请使用下面的建议。

修改安全应用程序块的建议

在修改源代码时,请按照这些最佳实践进行:

  • 通过阅读文档中的安全应用程序块的设计确保下理解了应用程序块是如何工作的。
  • 如果大量的修改了代码或者如果要在使用原始版本的同时使用定制的版本的话,考虑修改安全应用程序块的命名空间。注意,修改应用程序块的命名空间要求更新所有使用安全应用程序块的其他应用程序块和应用程序以使用新的命名空间。
  • 使用强名称。强名称允许程序集被唯一标识、版本化、以及进行完整性检查。这不得不生成自己的密钥对来签名应用程序块的修改版本。更多信息,请参见Strong-Named AssembliesVersioning Tutorial。另一种选择是,可以选择不签名定制的版本,这被称为弱名称。
  • 为了使用修改起作用,必须重新编译代码。打开安全应用程序块的 Visual Studio 解决方案文件,然后重新生成整个解决方案。

顶部

编辑

6 - 部署和操作

管理员的二个主要任务是确保安全应用程序块的初始部署是有计划、受管理的,以及后继更新对使用应用程序块的已有应用程序影响最少。此节解决了这些和其他管理主题:
  • 部署安全应用程序块
  • 更新安全应用程序块
  • 度量安全应用程序块

注意:在安全应用程序块部署到任何计算机之前,必须安装 Microsoft .NET Framework。

顶部

编辑

6.1 - 部署安全应用程序块

安全应用程序块以多个程序集组成。属于安全应用程序块的每个程序集的文件名都以 Microsoft.Practices.EnterpriseLibrary.Security 开头。除此之外,应用程序块还依赖于 Enterprise Library 内核。依赖于使用应用程序块的应用程序的配置,可能还需要数据访问应用程序块和缓存应用程序块程序集。使用安全应用程序块的应用程序可以被部署在二个配置之一中:

  • 可以被部署在应用程序集文件夹层次中做为私有程序集。
  • 可以被部署在任何文件系统位置或者全局程序集缓存中做为共享程序集。

部署安全应用程序块为私有程序集

如果应用程序不必须使用来自全局程序集缓存中的可用服务,安全应用程序块就可以被部署在应用程序文件夹结构中。这简化了部署,因为可以通过使用 xcopy 命令在目标计算机上安装整个应用程序,包括安全应用程序块程序集。如果同一计算机上有多个应用程序使用安全应用程序块,可以在每个应用程序的文件夹层次中安全一个程序集的副本。这允许每个应用程序的程序集副本独立的被更新。

部署安全应用程序块为共享程序集

可以给安全应用程序块程序集签名一个强名称。Visual Studio .NET 和 .NET Framework SDK 中都包含了完成此工作的工具。在程序集被强命名后,就可以被部署在共享的位置并由多个应用程序使用。可以选择在任何文件系统位置部署程序集,然后使用安全应用程序块的每个应用程序的配置文件中添加<codeBase>元素指定程序集的位置。关于强命名 Enterprise Library 程序集的信息,请参见强命名 Enterprise Library 程序集。

更加可能的场景是在全局程序集缓存中部署共享程序集。在此场景中,计算机中的所有应用程序都可以使用程序而不需要任何其他配置。可以使用下列工具之一来在全局程序集缓存中安装程序集:

  • 安装程序,如 Microsoft Windows Installer, version 2.0
  • 全局程序程序集缓存工具命令行实用工具(Gacutil.exe)
  • .NET Framework 配置工具(Mscorcfg.msc)

顶部

编辑

6.2 - 更新安全应用程序块

如果安全应用程序块已有升级的版本,就可以安装升级版本以使所有应用程序使用升级后的程序集。然而,如果升级版本引入了特定应用程序的兼容问题,就可以在全局程序集缓存中安装升级的版本,并配置某些应用程序使用升级版本,同时其他的继续使用早期版本。

更新私有程序集

如果安全应用程序块程序被部署为私有程序集,就可以通过使用升级版本的 DLL 简单的替换在应用程序文件夹层次中早期版本的 DLL 来部署升级。

注意:要保留早期版本的副本,如果新的程序集引起了任何兼容性问题,就可以恢复到早期版本。

更新共享程序集

在共享配置中升级安全应用程序块程序集最简单的方法是在全局程序集缓存中安装更新的 DLL 。默认情况下,通用语言运行时会尝试加载最新的构建和版本号,但与应用程序构建时使用的程序集有相同主次版本号的程序集。因此,如果主次版本号没有改变的话,添加更新的版本到全局程序集缓存中会自动更新所有引用到安全应用程序块程序集的应用程序。

顶部

编辑

6.3 - 度量

这些是在应用程序配置文件中用于开启/关闭度量的节。它们是可选的,但在文件中必须同时存在或者同时不在在。如果忽略它们,将与值是 false 一样。<configSections>节是告诉 System.Configuration 库如何读取真实配置数据的地方。设置值为 true 开启度量,设置值为 false 关闭度量。三种度量类型是性能计数器、事件日志和 WMI 事件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
      <configSections>
    <section name="instrumentationConfiguration"  
type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection, 
Microsoft.Practices.EnterpriseLibrary.Common" />
      </configSections>
  <instrumentationConfiguration performanceCountersEnabled="true" 
eventLoggingEnabled="true" wmiEnabled="true" />
</configuration>

顶部

编辑

6.3.1 - 安全应用程序块性能计数器

表 1 列出了安全应用程序块的性能计数器。

表 1:安全应用程序块性能计数器
性能计数器名称描述
Authorization Requests/sec接收授权请求的速率。
Authorization Requests Denied/sec拒绝授权请求的速率。
Security Cache Reads/sec请求读取安全缓存的速率。

速率计数器简化了一个越着时间增长的数量,并通过按时间来分割值以显示活动的速率,关于性能计数器的更多信息,请参见.NET Framework 类库 中的 PerformanceCounterType 枚举值

顶部

编辑

6.3.1 - 安全应用程序块事件日志实体

表 1 列出了安全应用程序块事件日志的实体。监听程序列是触发事件的类,事件列是事件的名称,异常列是异常的 Boolean 值,主消息列是主错误消息。

表 1:安全应用程序块事件日志实体
监听程序事件异常主消息
DefaultSecurityEventLoggerConfigurationFailuretrue使用 实例名 实例发生错误。
DefaultSecurityEventLoggerConfigurationFailuretrue获取用于安全缓存提供程序实例 实例名 时发生错误。

顶部

编辑

6.3.3 - 安全应用程序块 WMI 事件

安全应用程序块用下面的 WMI 事件进行度量:
  • AuthorizationCheckFailedEvent
  • AuthorizationCheckPerformedEvent
  • SecurityCacheReadPerformedEvent
  • SecurityConfigurationFailureEvent

下列表格描述了每个 WMI 事件的属性。

表 1 描述了 AuthorizationCheckFailedEvent WMI 事件的属性。

表 1:AuthorizationCheckFailedEvent 的属性
WMI 属性描述
UserName授权失败的用户名
TaskName用户没有授权执行的任务。
InstanceName被拒绝授权的授权提供程序的 ID,它被指定在配置文件中。
UtcTimeStamp授权尝试失败的时间。

表 2 描述了 AuthorizationCheckPerformedEvent WMI 事件的属性。

表 2:AuthorizationCheckPerformedEvent 的属性
WMI 属性描述
UserName检查的用户名。
TaskName用户要执行的任务。
InstanceName执行检查的授权提供程序的 ID,它被指定在配置文件中。
UtcTimeStamp授权检查发生的时间。

注意AuthorizationCheckPerformedEvent WMI 事件在每次授权检查发生时都触发,而不仅仅是成功的检查。

表 3 描述了 SecurityCacheReadPerformedEvent WMI 事件的属性。

表 3:SecurityCacheReadPerformedEvent 的属性
WMI 属性描述
EntityType用户实体的类型,在配置文件中被指定。可以是 Identity 对象、Profile 对象或者 Principal 对象。
Token从缓存中获取的标识凭证。
InstanceName读取的安全缓存提供程序的 ID,它被指定在配置文件中。
UtcTimeStamp安全缓存被读取的时间。

表 4 描述了 SecurityConfigurationFailureEvent WMI 事件的属性。

表 4:SecurityConfigurationFailureEvent 属性
WMI 属性描述
ExceptionMessage在尝试创建或者配置安全提供程序失败时触发的异常的消息。
InstanceName无法创建或者配置的安全提供程序的 ID,它被指定在配置文件中。
UtcTimeStamp配置失败发生的时间。

顶部

编辑

7 - 快速入门

Enterprise Library 快速入门是简单的、易于理解的应用程序块关键特性的示例,使用了一个实现了常规场景的漫游集合来说明这些特性。漫游是常见场景的实现。

如果要理解一个应用程序块,快速入门将是理想的起始点,并且用试验源代码来学习新的技术也是非常舒服的。如果已对 .NET 框架比较熟悉,以及如果要查看简单的、有助于理解如何解决特定问题的代码示例的话,它们将是非常好的资源。

要使用快速入门的所有优点的话,将需要熟悉面向对象编程相关的概念和技术。

顶部

编辑

7.1 - 安全快速入门

安全快速入门应用程序示范了安全应用程序块的某些关键特性。它通过使用一个漫游集合来示范这些特性,漫游是在关键场景中讨论的情况的实现。漫游说明了下列这些方面:
  • 获取用于已认证用户的临时凭证
  • 用凭证认证一个用户
  • 终止用户的会话(终止凭证)
  • 决定用户是否被授权执行某个任务

系统需求

要构建和运行本快速入门,需要下面的系统:
  • Microsoft Windows XP Professional, Windows Server 2003, 或者 Windows Vista 操作系统
  • Microsoft .NET Framework, version 2.0
  • Microsoft Visual Studio 2005 开发系统

构建和运行快速入门

快速入门以源代码的形式发布,这意味着在运行它之前必须编译它。可以使用 Visual Studio 来构建快速入门。

生成安全快速入门
  • 确保已安装 Enterprise Library 的源代码
  • 从 Windows 资源管理器中打开 Enterprise Library 源代码文件夹,或者从开始菜单快捷方式:在任务栏上,单击开始,指向程序,指向 Microsoft patterns and practices ,指向 Enterprise Library 3.1 – May 2007 ,然后选择 Enterprise Library 3.1 Source Folder
  • 打开 QuickStarts 文件夹,然后是 Security,然后是 CS(用于C#)或者 VB (用于 Visual Basic .NET)
  • 双击 SecurityQuickStart.sln 图标。
  • Visual Studio 将打开,显示解决方案文件,在菜单上,单击生成
  • 单击重新生成解决方案。默认情况下,这是 debug 生成。
  • F5 运行快速入门。

快速入门的配置

安全快速入门中的漫游带有默认配置,配置被包含在 App.config 文件中。此文件被放置在快速入门项目文件的文件夹中,它有下面的设置。

认证的配置

认证的配置如下:
  • Name: RuleProvider
  • Type: Authorization Rule Provider
  • Rules:
    • Print Document: NOT I:?
    • Hire Employee: R:Manager OR R:HumanResources
    • Submit New Order: (R:Employee AND (NOT I:Bob))

安全缓存配置

缓存的配置如下:
  • Name: Caching Store Provider
  • AbsoluteExpiration: 60
  • CacheManager: Default Cache Manager
  • SlidingExpiration: 10

缓存应用程序块的配置

缓存应用程序块的配置如下:
  • 缓存管理器:
    • Name: Default Cache Manager
    • ExpirationPollFrequencyInSeconds: 60
    • MaximumElementsInCacheBeforeScavenging: 1000
    • NumberToRemoveWhenScavenging: 10

要修改或者查看这些设置,使用 Enterprise Library 配置控制台打开包含在快速入门项目文件目录中的 App.config 文件。App.config 文件中包含了配置数据。

在每次构建代码时,Visual Studio 都会复制 App.config 文件到项目的输出目录中(与创建的快速入门可执行文件是同一目录),并重命名为 SecurityQuickStart.exe.config 。

这意味着,如果要使用配置控制台修改任何配置设置,如终止周期,以及计划重新生成解决方案,就必须通过打开放置在快速入门源代码目录中的 App.config 来修改设置。也可以使用配置控制台打开 SecurityQuickStart.exe.config 文件并修改应用程序的配置。但,这些修改会在下次成功生成期间被覆盖。

顶部

编辑

7.1.1 - 漫游:获取已认证用户的临时凭证

此漫游示范了如何使用安全应用程序块来获取用户已认证用户的凭证。

重建示范

1. 通过添加下列代码创建安全缓存。

C#
ISecurityCacheProvider cache;
cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");

Visual Basic
Dim cache As ISecurityCacheProvider
cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider") 

2. 授权用户。下面的代码示范了如何使用 System.Web.Security.Membership 类授权用户。

C#
IIdentity identity = null;
if (Membership.ValidateUser("username", "password"))
{
  identity = new GenericIdentity("username", Membership.Provider.Name);
}

Visual Basic
Dim identity As IIdentity = Nothing

If (Membership.ValidateUser("username", "password")) Then
  identity = New GenericIdentity("username", Membership.Provider.Name)
End If

3. 通过添加下面的代码来调用安全缓存对象中的 SaveIdentity 方法。

C#
IToken token = null; 
if (identity != null)
{
token = cache.SaveIdentity(identity);
}

Visual Basic
Dim token As IToken = Nothing
If (Not identity Is Nothing) Then
  token = cache.SaveIdentity(identity)
End If

这保存了标识信息并返回一个凭证。

顶部

编辑

7.1.2 - 漫游:用凭证认证用户

此漫游示范了如何使用安全应用程序块用一个凭证认证用户。

重建示范

1. 授权用户。下列代码示范了如何用 System.Web.Security.Membership 类认证用户。

C#
IIdentity identity = null;
if (Membership.ValidateUser("username", "password"))
{
  identity = new GenericIdentity("username", Membership.Provider.Name);
}

Visual Basic
Dim identity As IIdentity = Nothing

If (Membership.ValidateUser("username", "password")) Then
  identity = New GenericIdentity("username", Membership.Provider.Name)
End If

2. 通过添加下列代码创建安全缓存。

C#
ISecurityCacheProvider cache;
cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");

Visual Basic
Dim cache As ISecurityCacheProvider
cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider") 

3. 通过添加下列代码调用安全缓存对象上的 SaveIdentity 方法。

C#
IToken token = null; 
if (identity != null)
{
token = cache.SaveIdentity(identity);
}

Visual Basic
Dim token As IToken = Nothing
If (Not identity Is Nothing) Then
  token = cache.SaveIdentity(identity)
End If

4. 通过添加下列代码调用安全缓存对象上的 GetIdentity 方法。

C#
IIdentity savedIdentity = cache.GetIdentity(token);

Visual Basic
Dim savedIdentity As IIdentity = cache.GetIdentity(token)

这返回了与凭证关联的标识。如果凭证已过期,或者失效,GetIdentity 将返回 null

顶部

编辑

7.1.3 - 漫游:终止用户会话

此漫游示范了如何使用安全应用程序块终止用户凭证。

重建示范

1. 认证用户。下列代码示范了如何用 System.Web.Security.Membership 类认证用户。

C#
IIdentity identity = null;
if (Membership.ValidateUser("username", "password"))
{
  identity = new GenericIdentity("username", Membership.Provider.Name);
}

Visual Basic
Dim identity As IIdentity = Nothing

If (Membership.ValidateUser("username", "password")) Then
  identity = New GenericIdentity("username", Membership.Provider.Name)
End If

2. 通过添加下列代码创建安全缓存。

C#
ISecurityCacheProvider cache;
cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");

Visual Basic
Dim cache As ISecurityCacheProvider
cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider") 

3. 通过添加下列代码调用安全缓存对象上的 SaveIdentity 方法。

C#
IToken token = null; 
if (identity != null)
{
token = cache.SaveIdentity(identity);
}

Visual Basic
Dim token As IToken = Nothing
If (Not identity Is Nothing) Then
  token = cache.SaveIdentity(identity)
End If

4. 通过添加下列代码调用安全缓存对象上的 ExpireIdentity 方法。

C#
cache.ExpireIdentity(token);

Visual Basic
cache.ExpireIdentity(token)

这从缓存是移除了与凭证关联的标识信息。

顶部

编辑

7.1.4 - 漫游:确定用户是否已授权执行任务

此漫游示范了如何使用安全应用程序块决定用户是否被授权执行一个特定任务。

重建示范

1. 通过添加下列代码创建一个 GenericPrincipal 对象表示用户和角色信息。

C#
IPrincipal principal = new GenericPrincipal(new GenericIdentity("tim"), new string[]{"Manager"});

Visual Basic
Dim principal As IPrincipal = New GenericPrincipal(New GenericIdentity("tim"), New String() {"Manager"})

2. 通过添加下列代码执行授权检查。

C#
bool authorized = ruleProvider.Authorize(principal, "Submit Order");

Visual Basic
Dim authorized As Boolean =ruleProvider.Authorize(principal, "Submit Order")

顶部
.NET 藏经阁 | | 版权所有 ©2008 entlib.net.cn