使用COM+中基于角色的安全性遇见的问题

lihao9806 2004-06-28 01:39:03
比如:我定义一个角色“管理员”,我在组件级指定了这个角色,则这个角色可以

访问组件的所有方法,这没有问题。但是,如果我在接口级指定了这个角色,却不

能访问这个接口,这是为什么?(我判断是:只有在组件级指定的角色才能实例化

这个组件,因此虽然这个角色能访问这个接口但是却不能实例化这个组件,所以不

行!如果真是如此,在.net下COM+的基于角色服务岂不是没用了?所以我想一定是

我的问题,呵呵~~~)

注:在Delphi下没有此问题,难道就因为Delphi写的是真正的COM?!
...全文
94 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihao9806 2004-06-28
  • 打赏
  • 举报
回复
结贴!
终于发现是什么该死的问题了。
System_EnterpriseServices_IServicedComponentInfo是它搞得鬼!服了~~~

总结:还不如用Delphi好!
lihao9806 2004-06-28
  • 打赏
  • 举报
回复
UP有分!
elite2018 2004-06-28
  • 打赏
  • 举报
回复
COM+ Components Warning When You Use Role-Based Security at the Interface Level

http://support.microsoft.com/default.aspx?scid=kb;en-us;301451

Activating Visual Basic Component with Interface Forwarding When Security Is Enabled
http://support.microsoft.com/default.aspx?scid=kb;en-us;230385

http://support.microsoft.com/search/default.aspx?InCC_hdn=True&Product=&KeywordType=ALL&Titles=false&numDays=&maxResults=25&Queryl=com%2B+interface+role&Query=com%2B+interface+role&Catalog=LCID%3D1033%26CDID%3DEN-US-KB%26PRODLISTSRC%3DON&QuerySource=gsfxSearch_Query&srchExtraQry=
terryxin 2004-06-28
  • 打赏
  • 举报
回复
只能帮你顶
lihao9806 2004-06-28
  • 打赏
  • 举报
回复
TO redbb: 多谢,这个例子我已经看过了。小弟已自感“看无可看”,问题还是搞不定!

望高手指点~~~~~~ 呵呵
elite2018 2004-06-28
  • 打赏
  • 举报
回复
先看看这个:

基于角色的安全性


如果多个用户调用在 COM+ 下运行的 COM 组件,您需要进行验证,只允许特定用户访问某个组件。COM+ 允许您定义角色并为其分配 NT 用户。定义并设置角色后,就可以指定哪些角色可以运行哪些组件,甚至指定可以运行组件上的哪些方法。

请在此 COMPlusServices 类中添加一个方法,以添加基于角色的安全性。您需要创建名为 Managers 的角色,并在新方法中进行测试,查看调用者是否为 Managers 角色。

添加基于角色的安全性的步骤
不用直接从组件服务 MMC 管理单元修改 COM+ 应用程序来添加安全角色,只需在项目中添加一个新属性。使用 SecurityRoleAttribute 类添加新的 Managers 角色。这个类的构造函数有两个参数:role(字符串值)和 everyone(布尔值)。role 参数指定要创建的角色的名称,everyone 参数指定是否将内置 Everyone 组添加到此角色的用户中。

在注释“COM+ 注册详细信息”下键入以下代码,将新的安全性角色添加到 COM+ 应用程序中。
'********************************************
' COM+ 注册详细信息

' 基于角色的安全性属性
<Assembly: SecurityRoleAttribute("Managers", False)>
更改安全级别设置,以便在进程级和组件级执行访问检查。这使 COM+ 应用程序具有安全性调用上下文。
显示 COM+ 服务管理单元。
单击 Security(安全性)选项卡并更改安全级别,如图 3 所示。


图 3:在 COM+ 目录中设置安全级别属性

除了手动进行处理外,还可以在组件中添加属性,通知组件执行访问级别检查。以下是在 COMPlusServices 类一开始的“COM+ 注册详细信息”部分添加的代码。

<Assembly: ApplicationAccessControlAttribute
(AccessChecksLevel:=AccessChecksLevelOption.ApplicationComponent)>
检查安全性角色
现在,将新方法添加到名为 IsManager 的类中。此方法将检查用户是否为具有 Managers 角色的成员。此方法是一个函数,它返回一个布尔值,表明调用者是否为 Managers 角色。要访问调用该方法的用户的安全上下文,需要使用 SecurityCallContext 类。通过调用 CurrrentCall 方法,获得当前用户的上下文。然后调用 IsCallerInRole 方法,并传递 Managers 作为此角色的名称。

将以下方法添加到 COMPlusServices 类中。
Public Function IsManager() As Boolean

Dim objCallContext As SecurityCallContext = _
SecurityCallContext.CurrentCall

IsManager = _
objCallContext.IsCallerInRole("Managers")

End Function
现在,需要重新生成该组件以测试此新方法。

从 Visual Studio .NET 的 Build(生成)菜单中,单击 Rebuild Solution(重新生成解决方案)。
试一试
修改控制台客户端应用程序的 Sub Main() 方法中的代码。此代码应如下所示:
Sub Main()

Dim objCOMPlus As New _
COMPlusJumpStart.COMPlusServices()

Console.WriteLine(objCOMPlus.DoTransaction)
Console.WriteLine(objCOMPlus.IsManager().ToString)
Console.ReadLine()

End Sub
在命令提示下键入您编译的可执行文件的名称,运行控制台应用程序。
第一次运行该代码时会发生异常,并说明访问被拒绝的原因是 Managers 角色中没有添加任何用户。要纠正这个异常,请将您自己添加为 Managers 中的用户,并再次运行该应用程序。这次应该不会出现任何异常。也可以在代码中添加异常处理。以下是添加了异常处理代码的客户端应用程序示例:

Sub Main()

Try

Dim objCOMPlus As New _
COMPlusJumpStart.COMPlusServices()

Console.WriteLine(objCOMPlus.DoTransaction)
Console.WriteLine(objCOMPlus.IsManager().ToString)
Console.ReadLine()

Catch objException As Exception
Console.WriteLine("出现错误。 " _
& "详细信息: " _
& objException.Message)
Console.ReadLine()

End Try

End Sub
lihao9806 2004-06-28
  • 打赏
  • 举报
回复
不会没有人用过吧?
Piyongcai 2004-06-28
  • 打赏
  • 举报
回复
在系统中配置试一试
lihao9806 2004-06-28
  • 打赏
  • 举报
回复
自己先UP一下,呵呵~~~~

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧