Frage

Ich habe einige Methoden, die als eine bestimmte Dienstkonto ausgeführt werden müssen, so dass ich die normale Sache:

public DoSomeWorkAsServiceAccount() {
    ...
    // assume I am given tokenHandle
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate();

    ...
    // do the work here
    ...

    impersonatedUser.Undo();
}

Ich mag diesen Code zu vermeiden, in jedem Verfahren zu schreiben, so dass ich dachte an ein benutzerdefiniertes Attribut erstellen:

[Impersonate(tokenHandle)]
public DoSomeWorkAsServiceAccount() {
    // do the work
}

Hier sind also meine Fragen:

  1. Ist das möglich?
  2. Können Sie mir etwas, das Code-Duplizierung vermeiden?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich glaube nicht, ein Attribut ist der beste Weg, um eine Funktion wie diese zu implementieren. Für die meisten Teile handeln Attribute lediglich als Meta-Daten über Typen und Member (Aspect Sachen beiseite orientiert). Sie müßten etwas schreiben für dieses Attribut zu überprüfen und eine neue Route entsprechend den Methodenaufruf. Wenn Sie bereits einige AOP-Code an der richtigen Stelle sollte dies nicht eine lästige Pflicht viel sein, aber wenn Sie dies nicht tun würden Sie wahrscheinlich viel besser durch etwas wie folgt bedient werden:

public void DoWorkAsUser(tokenHandle, Action op)
{
  WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
  WindowsImpersonationContext impersonatedUser = newId.Impersonate();

  op();

  impersonatedUser.Undo();
}

Und dann nennen Sie es wie folgt aus:

DoWorAsUser(token, MyMethod);

So können Sie den Identitätswechsel Code zentralisieren, ohne um mit Reflexion, codeweaving, etc zu Chaos mit.

Andere Tipps

Ich habe haben keinen Code, aber Sie könnten versuchen, mit Postsharp dies zu tun. Sie könnten eine OnMethodInvocationAspect schaffen, die die Sicherheit Sachen arrangiert, bevor die Methode Code aufrufen. zB

public class ImpersonateAttribute : OnMethodInvocationAspect
{
  public override void OnInvocation(MethodInvocationEventArgs eventArgs)
  {
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate();

    eventArgs.Proceed() // Call the code in the actual method.

    impersonatedUser.Undo();
  }
}

Das obige ist eine komplette Vermutung, aber durch sie darauf hindeutet, ich habe möglicherweise eine gültige Option gegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top