Wie zu verwenden IssuedToken in einem client mit einem WCF-Service-Referenz
Ich habe eine WinForms-Anwendung mit einem Service-Referenz erzeugt, die von einem WCF-Dienst, der verwendet WS2007FederationHttpBinding. Ich kann nicht verstehen, warum das folgende nicht funktioniert.
Meine WinForms-app ruft einen WCF-Dienst mithilfe von Thinktecture.IdentityServer, bis zu behandeln BearerKey Typ Token.
Von meinen Klienten, die ich einfach erwerben einen gültigen access-token und diesen Aufruf:
private static void CallServiceReference(SecurityToken token)
{
ServiceReference1.ClaimsServiceContractClient svcRef = new ServiceReference1.ClaimsServiceContractClient();
svcRef.ChannelFactory.Credentials.SupportInteractive = false;
svcRef.ChannelFactory.CreateChannelWithIssuedToken(token);
var claims = svcRef.GetClaims();
}
Hier ist die winforms-client-app.config für die service-Referenz:
<system.serviceModel>
<bindings>
<ws2007FederationHttpBinding>
<binding name="WS2007FederationHttpBinding_ClaimsServiceContract">
<security mode="TransportWithMessageCredential">
<message establishSecurityContext="false" issuedKeyType="BearerKey">
<issuer address="https://identity.MyCo.com/issue/wsfed" binding="ws2007HttpBinding"
bindingConfiguration="https://identity.MyCo.com/issue/wstrust/mixed/username" />
<issuerMetadata address="https://identity.MyCo.com/issue/wstrust/mex" />
<tokenRequestParameters>
<trust:SecondaryParameters xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<trust:KeyType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
<trust:CanonicalizationAlgorithm xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://www.w3.org/2001/10/xml-exc-c14n#</trust:CanonicalizationAlgorithm>
<trust:EncryptionAlgorithm xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://www.w3.org/2001/04/xmlenc#aes256-cbc</trust:EncryptionAlgorithm>
</trust:SecondaryParameters>
</tokenRequestParameters>
</message>
</security>
</binding>
</ws2007FederationHttpBinding>
<ws2007HttpBinding>
<binding name="https://identity.MyCo.com/issue/wstrust/mixed/username">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" />
<message clientCredentialType="IssuedToken" establishSecurityContext="false" />
</security>
</binding>
</ws2007HttpBinding>
</bindings>
<client>
<endpoint address="https://roadie/WebTest/service.svc" binding="ws2007FederationHttpBinding"
bindingConfiguration="WS2007FederationHttpBinding_ClaimsServiceContract"
contract="ServiceReference1.ClaimsServiceContract" name="WS2007FederationHttpBinding_ClaimsServiceContract" />
</client>
</system.serviceModel>
Wenn ich versuche, und führen Sie die service-Aufruf (svcRef.GetClaims()) bekomme ich diese Fehlermeldung:
"Die Adresse des security token Emittentin ist nicht angegeben. Eine explizite Emittent-Adresse muss angegeben werden, in der verbindlich für die Zielgruppe ' https://identity.MyCo.com/issue/wsfed " oder von den lokale Emittenten-Adresse muss konfiguriert werden, in der Anmeldeinformationen."
Dieser Fehler ist lahm und unübersichtlich ist, scheint, wie es einem Emittenten angegeben in der config!!!
Schließlich kenne ich die WCF-service-und Identity-service gültig sind, weil diese alle funktioniert mithilfe einer benutzerdefinierten ChannelFactory, auch mit dieser genau die gleiche Methode anwenden, die token:
var channel = factory.CreateChannelWithIssuedToken(token);
Aber meine Anforderung ist die Verwendung der generierten ServiceReference. 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie die angelegten Kanal, wie dieses:
Ich denke, nur so kann man die Verwendung der generierten proxy von der service-Referenz ist, wenn Sie die Konfiguration Ihres client fordert automatisch ein token und legen Sie die entsprechenden ClientCredentials Immobilie auf der proxy-Instanz erstellen Sie, bevor Sie den service rufen.
Sind wir mit einem ausgestellten token, die wir halten um Sie auf dem client zwischengespeichert in einem Projekt arbeite ich an, aber dann müssen wir den Kanal Fabrik CreateChannelWithIssuedToken genauso wie Sie es beschreiben.
BTW, ist dies bei der Verwendung von WIF in .NET 4.0. Vielleicht gibt es andere Möglichkeiten, wenn ausgeführt wird .NET 4.5.
Manchmal ist man gar nicht auf die verwiesen wird client-stub-DLL, dann können Sie reflection, um dynamisch geladen und aufgerufen werden können.
Hier ist eine Reflexion version zu erstellen, die den client mit ausgestellten token: