我目前正在尝试为我们的项目构建自定义代码访问安全解决方案。
因此,我创建了一个 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);
}
以上所有内容都在签名的“Assembly A”中。
未签名的程序集 B 包含以下实现程序集 A 的 ICustomPrincipial 的 CustomPrincipial 实现:
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)
在应用程序启动时,CustomPrincipial 的一个新实例被分配给 Thread.Current.CurrentPrincipial。
两个问题:
程序集 A 中的公共 ICustomPermission 接口会导致安全问题吗?
是否绝对有必要全面实施所有 IPermission 成员?尤其是 ToXML 和 FromXML 方法……每次我在运行时访问 MethodABC() 时,都会调用 CreatePermission() 方法。
编辑: 广告 1:我正在考虑以下情况:“程序集 C”包含受 CustomPermissionAttribute 保护的 MethodXY。为了访问这个受保护的方法,攻击者可以创建一个新的应用程序,引用程序集 A 和程序集 C,并且可以自己实现程序集 A 的公共 ICustomPrincipial 接口(-> HasPermission() 一直返回 true)。他可以将他的实现实例分配给他自己的 Thread.Current.CurrentPrincipial。如果程序集 A 的 Demand() 方法检查 Thread.Current.CurrentPrincipial,则攻击者可以访问 MethodXY。这可能是一种可能的情况..!?