Ich versuche, einen WCF
-Dienst eingerichtet von ADFS
geschützt. Ich bin derzeit in der Lage ein Token anzufordern und mit der Bitte WIF
und Thinktecture IdentityModel 4.5
mit dem folgenden Code an:Einschließlich SAML2.0-Token in WCF-Serviceanruf ohne WIF
static SecurityToken GetToken()
{
var factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
"https://fs2.server2012.local/adfs/services/trust/13/usernamemixed")
{
TrustVersion = TrustVersion.WSTrust13
};
if (factory.Credentials != null)
{
factory.Credentials.UserName.UserName = @"username";
factory.Credentials.UserName.Password = "password";
}
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
KeyType = KeyTypes.Symmetric,
AppliesTo = new EndpointReference(
"https://wcfservicecertificate/wcfservice/Service.svc/wstrust"),
};
var channel = factory.CreateChannel();
RequestSecurityTokenResponse rstr;
return channel.Issue(rst, out rstr);
}
Damit kann ich den WCF-Dienst aufrufen, indem ChannelFactory.CreateChannelWithIssuedToken
mit:
var factory = new ChannelFactory<IService>(binding,
new EndpointAddress("https://wcfservicecertificate/wcfservice/Service.svc/wstrust"));
if (factory.Credentials != null)
{
factory.Credentials.SupportInteractive = false;
factory.Credentials.UseIdentityConfiguration = true;
}
var proxy = factory.CreateChannelWithIssuedToken(GetToken());
var result= proxy.GetData(2);
Dies funktioniert wie erwartet, kann aber nur auf (mobilen) Windows-Plattformen verwendet werden. Ich möchte auch das gleiche Prinzip auf iOS und Android verwenden können. Mit this article konnte ich eine Sicherheits-Token von ADFS beantragen mit dem folgenden Code:
const string soapMessage =
@"<s:Envelope xmlns:s=""http://www.w3.org/2003/05/soap-envelope""
xmlns:a=""http://www.w3.org/2005/08/addressing""
xmlns:u=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"">
<s:Header>
<a:Action s:mustUnderstand=""1"">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</a:Action>
<a:To s:mustUnderstand=""1"">https://fs2.server2012.local/adfs/services/trust/13/UsernameMixed</a:To>
<o:Security s:mustUnderstand=""1"" xmlns:o=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"">
<o:UsernameToken u:Id=""uuid-6a13a244-dac6-42c1-84c5-cbb345b0c4c4-1"">
<o:Username>username</o:Username>
<o:Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"">password</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityToken xmlns:trust=""http://docs.oasis-open.org/ws-sx/ws-trust/200512"">
<wsp:AppliesTo xmlns:wsp=""http://schemas.xmlsoap.org/ws/2004/09/policy"">
<a:EndpointReference>
<a:Address>https://wcfservicecertificate/wcfservice/Service.svc/wstrust</a:Address>
</a:EndpointReference>
</wsp:AppliesTo>
<trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey</trust:KeyType>
<trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
<trust:TokenType>urn:oasis:names:tc:SAML:2.0:assertion</trust:TokenType>
</trust:RequestSecurityToken>
</s:Body>
</s:Envelope>";
var webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/soap+xml; charset=utf-8");
var result = webClient.UploadString(
address: "https://fs2.server2012.local/adfs/services/trust/13/UsernameMixed",
method: "POST",
data: soapMessage);
Dies führt zu einem SAML2.0 Token, das Ich mag würde in einer Anfrage an unseren WCF-Dienst senden, um zu authentifizieren. Es gibt verschiedene Quellen (einschließlich des oben erwähnten Artikels), die besagen, dass dies möglich sein sollte, aber ich muss noch eine Lösung finden.
Jede Hilfe wäre willkommen.
I Ich kenne die Antwort nicht, aber ich werde mich bald selbst mit diesen Problemen auseinandersetzen müssen. Aus meinen Nachforschungen geht hervor, dass eine präzisere Aussage über das Problem lautet: "Wo in der Nachricht erwartet der WCF-Dienst das Token?". Ich konnte Google noch nicht dazu bringen, mir eine klare Antwort zu dieser Frage zu geben. Viel Glück! –
Nur eine Idee, aber wenn Sie WebClient verwenden, um das SAML-Token zu erhalten, würde ich annehmen, dass Sie WebClient oder einen anderen http-Client verwenden werden, um die Anfrage an den WCF-Endpunkt zu stellen. Wenn dies der Fall ist, können Sie Ihre Arbeits-http-Anfrage (Top-C# -Code) mit einem Tool wie Fiddler überprüfen und dann mit dem WebClient duplizieren. – GemCer
Ich würde vorschlagen, dass Sie OAuth 2 und JWT-Token anstelle von WS-Trust und SAML verwenden. –