ASP.Net WCF-Dienst des Thread.CurrentPrincipal wird von einigen Abfangjäger in einem Federated (WIF) -Umgebung weggeschmissen

StackOverflow https://stackoverflow.com/questions/1932424

  •  20-09-2019
  •  | 
  •  

Frage

Ich habe einen per-Call-WCF-Dienst, der in IIS (SVC) gehostet wird. In der Konstrukteurs-Service, habe ich Thread.CurrentPrincipal = HttpContext.Current.User per dieser Artikel . In diesem Fall HttpContext.Current.User ist vom Typ Microsoft.IdentityModel.Claims.ClaimsPrincipal und hat die Forderungen, die von meinen benutzerdefinierten passiven STS gesendet wurden.

Doch sobald ich in meinen Dienst Betrieb treten und prüfen Thread.CurrentPrincipal , während das Objekt noch vom Typ Microsoft.IdentityModel.Claims.ClaimsIdentity , die Objekt selbst ist nicht mehr das gleiche wie HttpContext.Current.User ( IsAuthenticated = false, AuthenticationType = "" und Name null auf Thread.CurrentPrincipal.Identity ), während diese Werte alle noch in korrekt auf HttpContext.Current.User gefüllt sind . Das sagt mir, dass etwas den Aufruf der Operation wird das Abfangen und fälschlicherweise den aktuellen Haupt zu einem gewissen Gattungswechsel leeren, nicht authentifizierte Ansprüche Haupt.

Ich habe die Thread-ID in dem Konstruktor sowie in Betrieb und es ist das gleiche in beiden Orten und Auswertung Thread.CurrentPrincipal in dem sofortigen Fenster, nachdem sie von Zuweisen HttpContext.Current .user zeigt, dass der Thread Identität im Konstruktor richtig eingestellt wird, so wird etwas auf jeden Fall zwischen den Konstruktor ausgeführt wird, und das Verfahren, und dass sich etwas ändert meine Thread.CurrentPrincipal .

Hat jemand eine Idee, was dies tut, und wie kann ich mich über Prävention / dieses Verhalten Festsetzung?

War es hilfreich?

Lösung 2

Wenn Sie einen Service für WIF Föderation konfigurieren, rufen Sie

FederatedServiceCredentials.ConfigureServiceHost(this);

Ein Teil dessen, was dieser Anruf tut, ist eine benutzerdefinierte einzurichten ServiceAuthorizationManager vom Typ IdentityModelServiceAuthorizationManager auf dem Service-Host. Dieser Ermächtigung Manager erscheint zwischen Aktivierung (Aufbau) der Instanz und Ausführung der Operation genannt zu werden, und es überschreibt Thread.CurrentPrincipal mit einer Instanz von IClaimsPrincipal , aber es scheint nicht zu erkennen, dass es in ASP.NET-Kompatibilitätsmodus ausgeführt wird, so dass es nicht die Haupt nicht ziehen von HttpContext.Current.User .

Ich war zu umgehen dieses Verhalten kann durch Ableiten von IdentityModelServiceAuthorizationManager und dem Überschreiben der Checkaccess Methode wie folgt:

public class CustomAuthorizationManager : IdentityModelServiceAuthorizationManager
{
    public override bool CheckAccess(System.ServiceModel.OperationContext operationContext, ref System.ServiceModel.Channels.Message message)
    {
        var result = base.CheckAccess(operationContext, ref message);

        var properties = operationContext.ServiceSecurityContext.AuthorizationContext.Properties;
        properties["Principal"] = System.Web.HttpContext.Current.User;

        return result;
    }
}

wird diese dann an den Service-Host wie folgt angewandt:

protected override void InitializeRuntime()
{
    FederatedServiceCredentials.ConfigureServiceHost(this);
    this.Authorization.ServiceAuthorizationManager = new CustomAuthorizationManager();
    base.InitializeRuntime();
}

Und jetzt, wenn ich meinen Service-Betrieb geben, habe ich die richtigen IClaimsPrincipal auf Thread.CurrentPrincipal , so deklarativen Principal funktioniert nun wie erwartet .

Andere Tipps

Ich lief in ein ähnliches Problem. Ich habe mein benutzerdefiniertes Haupt im Konstruktor meines WCF-Dienstes. Als ich den Konstruktor links, und trat in die Methode, die ich genannt wurde die Thread.CurrentPrincipal durch eine leere außer Kraft gesetzt. Ich löste dies durch das folgende Verhalten hinzufügen:

<serviceAuthorization principalPermissionMode="None"></serviceAuthorization>

Das hat gut funktioniert für mich.

konfguration Einstellungen für den Anruf FederatedServiceCredentials.ConfigureServiceHost (das );

ist als unten in system.serviceModel hinzuzufügen folgenden

<extensions>
      <behaviorExtensions>
        <add name="federatedServiceHostConfiguration" type="Microsoft.IdentityModel.Configuration.ConfigureServiceHostBehaviorExtensionElement, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </behaviorExtensions>
    </extensions>

unter innen add Folowing Zeile

<behavior name="serviceBehavior">
          <federatedServiceHostConfiguration name="MyService" />

Meine Vermutung ist, dass nichts den Anruf abfängt. Entweder wird die Current zurückgesetzt durch die Zeit, die Sie untersuchen, oder du bist in einem anderen Thread.

Überprüfen Sie die Current unmittelbar nach ihm zuweisen, und Sie sollten den richtigen Wert sehen.

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