Ale*_*r G 14 .net c# permissions .net-security
我想允许仅从特定方法调用方法.看看下面的代码.
private static void TargetMethod()
{
}
private static void ForbiddenMethod()
{
TargetMethod();
}
private static void AllowedMethod()
{
TargetMethod();
}
Run Code Online (Sandbox Code Playgroud)
我只需要AllowedMethod可以调用TargetMethod.如何使用来自的类System.Security.Permissions?
更新:感谢您的回答,但我不想讨论我的应用程序的设计.我只是想知道是否可以使用.net安全性来做到这一点?
Mar*_*ann 24
您可以使用常规的面向对象设计来解决此问题.移动AllowedMethod到新类并创建该类ForbiddenMethod的私有方法:
public class MyClass
{
public void AllowedMethod() { // ... }
private void TargetMethod() { // ... }
}
Run Code Online (Sandbox Code Playgroud)
AllowedMethod可以访问私有成员,但没有其他人拥有.
我相信你应该尝试结构meaningfull类代码,并使用标准的访问修饰符(private,protected,public,internal).有什么特别的理由说明为什么这不能解决你的问题?
我能想到的唯一替代方法是从被调用者内部遍历调用堆栈,但这可能会导致代码混乱和次优性能.
您可以检查调用堆栈来完成此任务,但速度相当慢.如果可以避免,我不会推荐它.
如果您仍然希望这样做,您还需要小心避免方法内联,否则您的代码可能会突然停止在Release版本下工作.
[MethodImpl(MethodImplOptions.NoInlining)]
private static void TargetMethod()
{
StackFrame fr = new StackFrame(1, false);
Console.WriteLine(fr.GetMethod().Name);
}
Run Code Online (Sandbox Code Playgroud)
据我所知,没有开箱即用的属性来做到这一点.
如果代码在完全信任的情况下运行,CAS 无法执行此操作。
如果代码在完全信任(即正常的本地应用程序,而不是 silverlight 应用程序或从网络运行的应用程序)中执行,则所有 .NET CAS 检查都将被完全绕过;任何安全属性都会被忽略。
不过,CAS 只是简单地遍历堆栈来确定权限,您也可以这样做,正如 Darin 之前指出的那样,只需检查StackTrace.
| 归档时间: |
|
| 查看次数: |
1135 次 |
| 最近记录: |