2016-04-08 7 views
0

Ich habe eine Webanwendung, die eine WCF-Methode aufruft, deren Identitätswechsel nach Bedarf festgelegt wurde. Bei dieser Methode muss ich einen anderen Webdienst (ASMX) aufrufen, der Sicherheitsgruppen zurückgibt. Das Problem ist, wenn der Identitätswechsel als erforderlich festgelegt ist, erhalte ich einen Fehler, wenn ich versuche, eine Instanz des ASMX-Dienstes zu erstellen.WCF-Identitätswechselfehler beim Aufruf von ASMX

WCF-Service-Methode

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public List<MacroTypeInfo> GetFilteredMacroDataTypes(MacroDataTypeSection section) 
{ 

    // Errors out here 
    using (var login = new local.intranet.webservices.login()) 
    { 
     login.getSecurityGroupsForUser(); // Never gets to this line 
    }  

} 

Der Fehler, den ich bekommen ist

Either a required impersonation level was not provided, or the provided  
impersonation level is invalid. (Exception from HRESULT: 0x80070542) 

Gibt es etwas, das ich in der Lage sein tun müssen diese Web-Service-Innenseiten dieser Identitätswechsel erforderlich Methode aufrufen? Sobald ich das OperationBehavior-Attribut entferne, funktioniert der Aufruf.

+0

FWIW Sie sollten ** nie * jemals *** Identitätswechsel verwenden, für * irgendeinen * Grund. –

+0

Können Sie dieses Denken erweitern? – user3726393

+0

Identitätsdiebstahl ist buchstäblich die schlechteste Lösung für Authentifizierung und Autorisierung. Selbst wenn Sie eine zentrale Verwaltung über einen Active Directory-Server zulassen möchten, sollten Sie keinen Identitätswechsel verwenden, den Sie authentifizieren und für den AD-Server als API autorisieren sollten. –

Antwort

1

Ein Server kann die Identität eines Clients für einen Remote-Server nur annehmen, wenn dafür eine Berechtigung vorliegt. Sie können über die verschiedenen Ebenen des Identitätswechsels lesen here

Wenn ein solcher Identitätswechsel erforderlich ist, muss der Client es explizit mit einem Identitätswechsel von Delegation zulassen.

Sie dies in einem WCF-Client mit dem folgenden Endpunktverhalten Konfiguration erreichen können:

<endpointBehaviors> 
    <behavior name="delegateIdentity"> 
     <clientCredentials> 
     <windows allowedImpersonationLevel="Delegation"/> 
     </clientCredentials> 
    </behavior> 
</endpointBehaviors> 

Wenn Sie einen generierten Proxy verwenden können Sie diesen Wert auf dem Proxy:

client.ChannelFactory.Credentials.Windows.AllowedImpersonationLevel = 
    System.Security.Principal.TokenImpersonationLevel.Delegation; 

Schließlich, wenn Sie Ihren Proxy mit einem ChannelFactory<T> erstellen, können Sie einfach den gleichen Wert wie oben auf Sie ChannelFactory<T> setzen.

+0

Gibt es eine Möglichkeit, den Identitätswechsel für diesen Aufruf zu ignorieren? – user3726393

+0

Wenn Sie die Kontrolle über den Login-Dienst haben, können Sie ihn ändern, damit ein Anrufer die Sicherheitsgruppen eines Benutzers abrufen kann. –

Verwandte Themen