我想允许仅从特定方法调用方法。看看下面的代码。
private static void TargetMethod()
{
}
private static void ForbiddenMethod()
{
TargetMethod();
}
private static void AllowedMethod()
{
TargetMethod();
}
我只需要AllowedMethod可以调用TargetMethod。如何使用System.Security.Permissions
中的类进行操作?
更新:感谢您的回答,但我不想辩论我的应用程序的设计。我只是想知道是否可以使用.net安全性来实现?
答案 0 :(得分:24)
您可以使用常规的面向对象设计解决此问题。将AllowedMethod
移至新类,并使ForbiddenMethod
成为该类的私有方法:
public class MyClass
{
public void AllowedMethod() { // ... }
private void TargetMethod() { // ... }
}
AllowedMethod可以访问私有成员,但没有其他人拥有。
答案 1 :(得分:8)
我相信您应该尝试在有意义的类中构建代码,并使用标准访问修饰符(private
,protected
,public
,internal
)。有什么特别的理由说明为什么这不能解决你的问题?
我能想到的唯一替代方法是从被调用者中遍历调用堆栈,但这可能会导致代码混乱和性能欠佳。
答案 2 :(得分:6)
您可以检查调用堆栈来完成此操作,但速度相当慢。如果可以避免,我不会推荐它。
如果你仍然想要这样做,你需要小心避免方法内联,否则你的代码可能会突然停止在Release版本下工作。
[MethodImpl(MethodImplOptions.NoInlining)]
private static void TargetMethod()
{
StackFrame fr = new StackFrame(1, false);
Console.WriteLine(fr.GetMethod().Name);
}
据我所知,没有开箱即用的属性可以做到这一点。
答案 3 :(得分:4)
我不确定这是否可以通过System.Security.Permissions
实现,但在TargetMethod
内,您可以获得调用者并采取相应行动:
StackTrace stackTrace = new StackTrace();
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);
答案 4 :(得分:4)
如果代码在Full Trust中执行(即普通的本地应用程序,而不是Silverlight应用程序或从网络运行的东西),则完全绕过所有.NET CAS检查;任何安全属性都会被忽略。
但是,CAS只是走过堆栈来确定权限,你也可以这样做,正如Darin先前通过检查StackTrace
所指出的那样。
答案 5 :(得分:3)
您可以使用CodeAccessPermission对象。您必须在自己的对象中实现该接口,以使其像您建议的那样工作。
http://msdn.microsoft.com/en-us/library/system.security.codeaccesspermission.aspx
答案 6 :(得分:2)
通过使用属性,您可以解决此问题。
使用条件属性。
在顶部
#define "Show"
public void TargetMethod()
{
//Code
}
[ Conditional("Hidden")]
public void HiddenMethod()
{
TargetMethod()
}
[ Conditional("Show")]
public void AllowMethod()
{
TargetMethod()
}
你的一个方法就会被召唤。