Microsoft Corporation
目标
本模块用于:
• | 创建一个使用 Enterprise Services 角色来限制谁能访问组件的功能的服务组件。 |
适用于:
本模块适用于下列产品和技术:
• | Microsoft® Windows® XP 或 Windows 2000 Server(带 Service Pack 3)以及更高版本的操作系统 |
• | Microsoft .NET Framework 版本 1.0(带 Service Pack 2) |
• | Microsoft Visual C#® .NET 开发工具 |
本模块的使用方法
要最大程度的利用本模块:
• | 必须有使用 Visual C# .NET 和 Microsoft Visual Studio® .NET 开发系统的经验。 |
• | 必须有开发和实现在 Enterprise Services (COM+) 上下文中运行的服务组件的经验。 |
• | 必须有使用组件服务管理工具来管理服务组件的经验。 |
• | 必须了解如何使用 Windows 管理工具来管理 Windows 用户帐户的组成员身份。 |
• | 阅读“Enterprise Services Security”模块。此模块描述了 Enterprise Services 的安全性功能以及可用于确保服务组件安全性的特定功能。 |
本页内容
摘要 | |
预备知识 | |
创建一个 Visual C# 类库应用程序来宿主服务组件 | |
创建服务组件 | |
配置服务组件 | |
为程序集生成一个强名称 | |
生成程序集并将其添加到全局程序集缓存 | |
手动注册服务组件 | |
检查已配置的应用程序 | |
创建一个测试客户端应用程序 |
摘要
Enterprise Services (COM+) 提供了一个扩展的安全性框架,可用于实现对有权访问您所开发服务组件的功能的人员进行细粒度控制。
本模块描述了如何创建一个使用 Enterprise Services 角色实现方法级授权的简单的服务组件。
预备知识
在开始使用本模块之前,应了解下列内容:
• | Enterprise Services角色不同于 .NET 角色。 |
• | Enterprise Services 角色可以含有 Windows 组和 Windows 用户帐户。 |
• | Enterprise Services 角色在 COM+ 目录中进行维护。 |
• | Enterprise Services 角色可在 Enterprise Services 应用程序、接口、类或方法级应用。 |
• | Enterprise Services 角色可通过使用服务组件的程序集中的 .NET 属性,以声明方式部分进行配置。 |
• | Windows 组和用户帐户必须由管理员在部署时进行添加。 |
• | 管理员可以使用组件服务管理工具或脚本。 |
• | 为了从 ASP.NET Web 应用程序有效地使用 Enterprise Services 基于角色的安全性,Web 应用程序必须在调用服务组件之前使用 Windows 身份验证并模拟调用方。 |
创建一个 Visual C# 类库应用程序来宿主服务组件
此过程将创建一个新的含有服务组件的 C# 类库应用程序。
要创建一个 C# 类库应用程序来宿主服务组件,请执行下列操作:
1. | 启动 Visual Studio .NET并创建一个新的名为 ServicedCom 的 C# 类库应用程序。 |
2. | 将默认类文件 Class1.cs 重命名为 SimpleComponent.cs。 |
3. | 双击 SimpleComponent.cs 将其打开,并将 Class1 类型重命名为 SimpleComponent。同时更新类的默认构造函数的名称。 |
创建服务组件
此过程将从 EnterpriseServices.ServicedComponent 类派生 SimpleComponent 类,以便将此类型转换为一个服务组件。然后创建一个接口并将其在 SimpleComponent 类中实现。要使用接口和方法级安全性,必须定义和实现这些接口。
要创建服务组件,请执行下列操作:
1. | 向 System.EnterpriseServices 程序集添加一个引用。 |
2. | 将下列 using 语句添加到 SimpleComponent.cs 文件顶部的现有 using 语句下。 using System.EnterpriseServices; |
3. | 从 ServicedComponent 中派生 SimpleComponent 类。 public class SimpleComponent : ServicedComponent |
4. | 在 ServicedCom 命名空间内添加下列接口定义。 public interface ISomeInterface { int Add( int operand1, int operand2 ); } |
5. | 从此接口派生 SimpleComponent。 public class SimpleComponent : ServicedComponent, ISomeInterface |
6. | 在 SimpleComponent 类中实现此接口,如下所示: public int Add( int operand1, int operand2 ) { return operand1 + operand2; } |
配置服务组件
此过程将配置服务组件以实现方法级的基于角色的安全性。
要配置服务组件,请执行下列操作:
1. | 直接在 SimpleComponent 类上添加下列属性。ComponentAccessControl 属性支持组件级访问检查,而 SecureMethod 属性则支持方法级访问检查。 [ComponentAccessControl] [SecureMethod] public class SimpleComponent : ServicedComponent, ISomeInterface |
2. | 将下列属性添加到 Add 方法上以创建 Manager 角色,并将其与此方法相关联。 [SecurityRole("Manager")] public int Add( int operand1, int operand2 ) { return operand1 + operand2; } |
3. | 打开 assemblyinfo.cs,然后将下列 using 语句添加到文件顶部的现有 using 语句下。 using System.EnterpriseServices; |
4. | 移动到文件的底部并添加下列属性。这些属性用于配置用来宿主服务组件的 Enterprise Services 应用程序。 // Configure the application as a server (out-of-process) application [assembly: ApplicationActivation(ActivationOption.Server)] // For meaningful role-based security, enable access checking at the process // and component levels by using the following .NET attribute. [assembly: ApplicationAccessControl(AccessChecksLevel= AccessChecksLevelOption.ApplicationComponent)] // Set the name and description for the application [assembly: ApplicationName("SimpleRoles")] [assembly: Description("Simple application to show ES Roles")] // Add some additional roles [assembly:SecurityRole("Employee")] [assembly:SecurityRole("Senior Manager")] |
为程序集生成一个强名称
必须对宿主服务组件的程序集进行强命名。此过程生成一个用于对程序集进行强命名的公共-私有密钥对。
要为程序集生成一个强名称,请执行下列操作:
1. | 打开一个命令窗口并转到当前项目目录。 |
2. | 使用 sn.exe 实用工具来生成含有公共-私有密钥对的密钥文件。 sn.exe -k SimpleComponent.snk |
3. | 在 Visual Studio 中,打开 assemblyinfo.cs。 |
4. | 定位到 [AssemblyKeyFile] 属性并将其修改为引用项目目录中的密钥文件,如下所示: [assembly: AssemblyKeyFile(@"../../SimpleComponent.snk")] |
生成程序集并将其添加到全局程序集缓存
此过程将生成含有服务组件的程序集,然后将其添加到全局程序集缓存。服务组件一般情况下均应在全局程序集缓存中注册,因为它们是系统级资源。在 COM+ 服务器应用程序中承载的服务组件要求安装在全局程序集缓存中,而库应用程序则不要求(尽管建议这样做)。
要生成程序集并将其添加到全局程序集缓存,请执行下列操作:1. | 在 Build 菜单上,单击 BuildSolution。 |
2. | 返回到命令窗口,然后运行下列命令将程序集添加到全局程序集缓存。 gacutil–i bin/debug/ServicedCom.dll |
手动注册服务组件
服务组件可以使用 Regsvcs.exe 工具来手动注册,也可以使用“惰性”注册来自动注册。使用“惰性”注册时,在第一次实例化服务组件的实例时,就会注册此组件(同时使用程序集的元数据来创建和配置宿主 COM+ 应用程序)。
为避免此种注册方式带来的一次性性能影响,此过程将手动注册服务组件。
要手动注册服务组件,请完成下列操作:
1. | 返回到命令窗口。 |
2. | 运行 regsvcs.exe 来注册组件。 regsvcs bin/debug/ServicedCom.dll |
检查已配置的应用程序
此过程使用组件服务工具并检查此前使用 .NET 属性创建的目录设置。
要检查已配置的应用程序,请执行下列操作:
1. | 从 Administrative Tools 程序组启动组件服务。 |
2. | 展开 ComponentServices、Computers、MyComputer 和 COM+ Applications。 |
3. | 右键单击 SimpleRoles,然后单击 Properties。 |
4. | 单击 Security 选项卡,并确保将 Enforce access checks for this application 选中以及将安全性级别设置为在进程和组件级别执行访问检查。此配置是此前使用 .NET 属性的结果。 |
5. | 单击 OK 来关闭 Properties 对话框。 |
6. | 展开 SimpleRoles 应用程序,然后展开 Components 文件夹和 ServicedCom.SimpleComponent 类。 |
7. | 导航到 Interfaces 文件夹中 ISomeInterface 方法下的 Add 方法。 |
8. | 右键单击 Add,然后单击 Properties。 |
9. | 单击 Security 选项卡,并注意 Manager 角色与方法相关联。 |
10. | 单击 OK 关闭 Properties 对话框。 |
11. | 展开 SimpleRoles 应用程序下的 Roles 文件夹。注意+此前用 .NET 属性创建的角色。同时还要注意 Marshaler 角色。此角色是此前通过添加 [SecureMethod] 属性而直接创建的,并且是实现方法级安全性所必需的。 |
创建一个测试客户端应用程序
此过程创建一个基于 Windows 窗体的测试客户端应用程序来实例化和调用服务组件。
要创建测试客户端应用程序,请执行下列操作:
1. | 向当前解决方案添加一个名为 TestClient 的新的 C# 基于 Windows 的应用程序。 | ||||||
2. | 向 ServicedCom 项目添加一个新的项目引用。
| ||||||
3. | 添加一个对 System.EnterpriseServices 的引用。 | ||||||
4. | 向应用程序的主窗体添加一个按钮。 | ||||||
5. | 双击此按钮来创建一个按钮单击事件处理程序。 | ||||||
6. | 将下列 using 语句添加到 form1.cs 顶部的现有 using 语句下。 using ServicedCom; | ||||||
7. | 返回到按钮单击事件处理程序,并添加下列代码来实例化和调用服务组件。 SimpleComponent comp = new SimpleComponent(); MessageBox.Show( "Result is: " + comp.Add(1, 2)); | ||||||
8. | 在 Build 菜单上,单击 BuildSolution。 | ||||||
9. | 在解决方案资源管理器中,右键单击 TestClient 项目,然后单击 Set as StartUp Project。 | ||||||
10. | 按 Ctrl+F5 来运行 TestClient 应用程序。 此时您可以看到生成了一个未处理的异常。 | ||||||
11. | 单击消息框上的 Details 按钮来查看异常详细信息。 您将看到已经生成了一个 System.UnauthorizedAccessException。这是因为您用来运行 TestClient 应用程序的交互登录帐户不是 Manager 角色的成员,而此角色要求在服务组件上调用 Add。 | ||||||
12. | 单击 Quit 停止应用程序。 | ||||||
13. | 返回到组件服务,并将您的当前(交互)帐户添加到 Manager 角色和 Marshaler 角色。 注 Enterprise Services 基础结构使用所有服务组件所公开的许多系统级接口。其中包括 IManagedObject、IDisposable 和 IServiceComponentInfo。如果在接口或方法级实现了访问检查,就会拒绝 Enterprise Services 基础结构对这些接口的访问。 结果是,Enterprise Services 创建一个名为 Marshaler 的特殊角色,并将此角色与这些接口相关联。在部署时,应用程序管理员需要将所有用户添加到需要访问此类的任何方法或接口的 Marshaler 角色。您可以用两种不同的方法将此操作自动化:
| ||||||
14. | 关闭 SimpleRoles 应用程序以使更改生效。要完成此操作,右键单击应用程序名,然后单击 Shutdown。 | ||||||
15. | 返回到 Visual Studio .NET,然后按 Ctrl+F5 再次运行 TestClient 应用程序。 | ||||||
16. | 单击窗体的按钮,并确认已成功调用了此方法。 |