Domanda

Voglio permettere chiamando il metodo solo dai metodi particolari. Date un'occhiata al il codice qui sotto.

  private static void TargetMethod()
  {
  }

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

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

Ho bisogno solo AllowedMethod poteva chiamare TargetMethod. Come farlo utilizzando le classi da System.Security.Permissions?

Aggiornato: Grazie per le vostre risposte, ma io non voglio discutere sulla struttura di mia applicazione. Voglio solo sapere è possibile farlo utilizzando la sicurezza .NET o no?

È stato utile?

Soluzione

CAS non può farlo se il codice è in esecuzione in piena fiducia.

Se il codice viene eseguito in Full Trust (vale a dire una normale, l'applicazione locale, non un'applicazione Silverlight o qualcosa di esecuzione dalla rete), quindi tutti i controlli .NET CAS sono completamente bypassato; qualsiasi attributo di sicurezza viene semplicemente ignorato.

CAS cammina semplicemente lo stack per determinare le autorizzazioni, però, e si può fare anche questo, come Darin ha sottolineato in precedenza, semplicemente controllando il StackTrace.

Altri suggerimenti

È possibile risolvere questo progettazione orientata agli oggetti normali utilizzando. Spostare AllowedMethod ad una nuova classe e fare ForbiddenMethod un metodo privato di quella classe:

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

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

AllowedMethod ha accesso ai membri privati, ma nessun altro ha.

Credo che si dovrebbe cercare di strutturare il codice in classi meaningfull, e utilizzare i modificatori di accesso standard (private, protected, public, internal). C'è un motivo specifico per cui questo non risolverebbe il problema?

L'unica alternativa che posso pensare, comporterebbe l'attraversamento dello stack di chiamate da dentro il chiamato, ma sarebbe probabilmente resa codice di disordine e prestazioni non ottimali.

Si potrebbe esaminare lo stack di chiamate per raggiungere questo obiettivo, ma è piuttosto lento. Io non lo consiglio se può essere evitato.

Se ancora voglia di fare questo, è necessario fare attenzione ad evitare metodo inline pure, o il vostro codice potrebbe improvvisamente smettono di funzionare sotto costruisce rilascio.

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

Per quanto ne so, non ci sono out-of-the-box attributi per farlo.

Non sono sicuro se questo è realizzabile con System.Security.Permissions, ma dentro TargetMethod si potrebbe ottenere il chiamante e agire di conseguenza:

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

Potreste essere in grado di utilizzare gli oggetti CodeAccessPermission. Avresti per implementare l'interfaccia nel proprio oggetto per farlo funzionare come si sta suggerendo però.

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

Utilizzando attributi si può risolvere questo problema.

uso condizionato Attributi.

In alto

#define "Show" 


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

Una delle vostre methos sarà chiamato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top