c# – 为自定义代码访问安全性实现IPermission
我目前正在尝试为我们的项目构建自定义代码访问安全解决方案.
因此我创建了一个CustomPermissionAttribute,应该如下所示使用: [CustomPermissionAttribute(SecurityAction.Demand,Permission="PermMethodABC")] public void MethodABC() { } Attribute的CreatePermission()方法创建并返回一个新的CustomPermission实例. CustomPermission类的Demand方法应该检查Thread.Current.CurrentPrincipial中我的自定义IPrincipial实现的安全性: public sealed class CustomPermission : IPermission { private string _RequiredPermission; ... public void Demand() { ICustomPrincipial _pr = Thread.Current.CurrentPrincipial as ICustomPrincipial; if (_pr == null) throw... if (!_pr.HasPermission(_RequiredPermission)) throw... } } public interface ICustomPrincipial : IPrincipial { bool HasPermission(string RequiredPermission); } 以上所有内容均在签署的“A组”中. 未签名的程序集B包含以下CustomPrincipial实现,该实现实现程序集A的ICustomPrincipial: public sealed class CustomPrincipial : ICustomPrincipial { User _User; ... public bool HasPermission(string RequiredPermission) { if (_User has permission defined with "PermMethodABC") ... return true/false; } ... } (现在程序集A必须知道有关用户类型的任何信息.如果我将CustomPrincipial类放入程序集A中,那么所有具有用户资料的程序集也必须进行签名…否则我无法编译程序集A) 在应用程序启动时,将为Thread.Current.CurrentPrincipial分配一个新的CustomPrincipial实例. 两个问题: >可以安装程序集A中公共ICustomPermission接口引起的安全问题吗? 编辑: 解决方法
假设您对权限很小心,Thread.Current.CurrentPrincipal对大多数其他程序应该是只读的,这使得绕过不可能. (至少从MSDN页面快速浏览一下) 但是,与任何安全问题一样,最好自己测试一下.尝试编写在您的环境中运行的代码,并实现自己绕过CurrentPrincipal的方法.
在完整实现的msdn页面上有一个示例,它看起来并不太令人讨厌,并且可以保证您以后不会因为NotImplementedException而出现问题. 但是,我没有对IPermission进行足够的实验来了解在正常操作期间调用哪些方法. 编辑:这是一个评论,但有点长. 要记住的一个重要事项是,如果一段代码具有修改主体的权限,那么就没有太多可以阻止它绕过您的任何权限. SecurityPermissionFlag.ControlPrincipal是设置CurrentPrincipal需求的权限.我相信除非你使用像Caspol.exe这样的工具,否则任何可执行文件都将在完全信任下运行. 总而言之,默认情况下,.NET框架假定自定义代码完全受信任,除非另有说明.如果您正在调用您不信任的代码,那么有机制可以确保代码以较低的安全凭证运行,或者如果您有可信任的可执行文件,则可以降低其安全凭据.但是,该计算机的任何管理员都有足够的能力绕过您实现的任何代码访问安全性(正如您对IPrincipal覆盖进行了评论). 如果这个解释不够好让我知道,我可以添加更多细节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |