Pregunta

Quiero permitir una llamada al método sólo de los métodos particulares. Echar un vistazo al siguiente código.

  private static void TargetMethod()
  {
  }

  private static void ForbiddenMethod()
  {
     TargetMethod();
  }

  private static void AllowedMethod()
  {
     TargetMethod();
  }

Sólo necesito AllowedMethod podría llamar TargetMethod. Cómo hacerlo utilizando las clases de System.Security.Permissions?

Actualizado: Gracias por sus respuestas, pero no quiero debatir sobre el diseño de mi solicitud. Sólo quiero saber es posible hacerlo con seguridad .net o no?

¿Fue útil?

Solución

CAS no puede hacer esto si el código se ejecuta con plena confianza.

Si el código está ejecutando en Plena confianza (es decir, una, aplicación local normal, no una aplicación de Silverlight o algo ejecutarse desde la red), entonces todos los cheques .NET CAS están completamente anuladas; cualquier atributo de seguridad es simplemente ignorado.

CAS simplemente camina la pila para determinar los permisos, sin embargo, y usted puede hacer eso también, como se ha señalado anteriormente Darin con sólo el control de la StackTrace.

Otros consejos

Puede resolver este utilizando el diseño orientado a objetos normales. AllowedMethod mover a una nueva clase y hacer ForbiddenMethod un método privado de esa clase:

public class MyClass
{
    public void AllowedMethod() { // ... }

    private void TargetMethod() { // ... }
}

AllowedMethod tiene acceso a los miembros privados, pero nadie más lo tenga.

Creo que debe tratar de estructurar su código en clases meaningfull, y el uso de los modificadores de acceso estándar (private, protected, public, internal). ¿Hay alguna razón específica por la cual esto no resolvería el problema?

La única alternativa que se me ocurre, implicaría que atraviesa la pila de llamadas desde el interior de la parte llamada, pero que probablemente produciría desorden de código y un rendimiento óptimo.

Se podría examinar la pila de llamadas para lograr esto, pero es bastante lento. Yo no lo recomendaría si puede evitarse.

En caso de que todavía quiere hacer esto, es necesario tener cuidado para evitar método de procesos en línea, así, o su código de repente deja de funcionar bajo generaciones de lanzamiento.

[MethodImpl(MethodImplOptions.NoInlining)]
private static void TargetMethod()
{
    StackFrame fr = new StackFrame(1, false);
    Console.WriteLine(fr.GetMethod().Name);
}

Por lo que yo sé, no hay fuera de la caja de atributos para hacer esto.

No estoy seguro de si esto se puede lograr con System.Security.Permissions, pero dentro TargetMethod se podía conseguir la persona que llama y actuar en consecuencia:

StackTrace stackTrace = new StackTrace();
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

Usted puede ser capaz de utilizar objetos CodeAccessPermission. Habría que implementar la interfaz en su propio objeto para hacer que funcione como si estuviera sugiriendo sin embargo.

http://msdn.microsoft.com/en -us / biblioteca / system.security.codeaccesspermission.aspx

Mediante el uso de atributos que puede resolver este problema.

Atributos de uso condicional.

En la parte superior

#define "Show" 


  public void TargetMethod()
    {
      //Code
    }
   [ Conditional("Hidden")]
   public void HiddenMethod()
    {
       TargetMethod()
    }
 [ Conditional("Show")]
  public void AllowMethod()
    {
       TargetMethod()
    }

Uno de sus methos se llamará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top