同一 AppDomain 上的多个程序集的不同安全权限

发布于 2024-11-28 09:49:09 字数 1120 浏览 0 评论 0原文

是否可以将多个程序集加载到新的 AppDomain 中并对每个程序集应用不同的 PermissionSet

比如说,通过授予其中一个程序集不受限制的 FileIOPermission 并拒绝其他程序集的此类权限来允许该程序集写入磁盘。

如果可以的话。如何?

更新

附注我正在从不执行 DLL 的 DLL 中创建类型的实例,因此我使用 LoadCreateInstanceAndUnwrap 而不是 ExecuteAssembly

更新

我尝试(但失败)使用以下代码使用 load 方法提供证据:

Dim domain As AppDomain = AppDomain.CreateDomain("AssembliesDomain")
Dim protectedSet As New PermissionSet(PermissionState.None)

protectedSet.AddPermission(New SecurityPermission(SecurityPermissionFlag.Execution))
protectedSet.AddPermission(New IsolatedStorageFilePermission(PermissionState.Unrestricted))
protectedSet.PermitOnly()

domain.Load(protectedAssembly, New Evidence(Nothing, {protectedSet}))
domain.Load(unprotectedAssembly, New Evidence(Nothing, {protectedSet}))

Console.WriteLine(domain.CreateInstanceAndUnwrap(protectedAssembly, protectedAssembly & ".Actions").Sum(1, 2))
Console.WriteLine(domain.CreateInstanceAndUnwrap(unprotectedAssembly, unprotectedAssembly & ".Actions").Sum(1, 2))
Console.ReadLine()

Is it possible to load multiple assemblies into a new AppDomain and apply different PermissionSet to each?

Say, allow one of the assemblies to write to disk by granting it an unrestricted FileIOPermission and denying such permission to the other(s).

If it's possible. How?

Update

P.S. I'm creating instances of types out of DLL's not executing exes, so I'm using Load and CreateInstanceAndUnwrap instead of ExecuteAssembly.

Update

I tried (and failed) providing evidence with the load method with the following code:

Dim domain As AppDomain = AppDomain.CreateDomain("AssembliesDomain")
Dim protectedSet As New PermissionSet(PermissionState.None)

protectedSet.AddPermission(New SecurityPermission(SecurityPermissionFlag.Execution))
protectedSet.AddPermission(New IsolatedStorageFilePermission(PermissionState.Unrestricted))
protectedSet.PermitOnly()

domain.Load(protectedAssembly, New Evidence(Nothing, {protectedSet}))
domain.Load(unprotectedAssembly, New Evidence(Nothing, {protectedSet}))

Console.WriteLine(domain.CreateInstanceAndUnwrap(protectedAssembly, protectedAssembly & ".Actions").Sum(1, 2))
Console.WriteLine(domain.CreateInstanceAndUnwrap(unprotectedAssembly, unprotectedAssembly & ".Actions").Sum(1, 2))
Console.ReadLine()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

太傻旳人生 2024-12-05 09:49:09

添加此行(以解决您遇到的异常):

protectedSet.AddPermission(new UIPermission(PermissionState.Unrestricted)); 

有用的文章:http://www .reliablesoftware.com/articles/UnderstandingSecurityActions.html

Add this line (to get around the exception you're getting):

protectedSet.AddPermission(new UIPermission(PermissionState.Unrestricted)); 

Helpful article: http://www.reliablesoftware.com/articles/UnderstandingSecurityActions.html

长伴 2024-12-05 09:49:09

您可以在使用 Assembly.Load 方法实例化自定义程序集之一时指定自定义 Evidence 对象,或者查看 此处

You could either specify custom Evidence object when using the Assembly.Load method to instantiate one of your custom Assemblies, or have a look here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文