Sono stato in grado di recuperare, decodificare il token di sicurezza (SWT) da vari provider di identità configurati in ACS. Ora dovrei essere - secondo l'esempio - in grado di farlo:Come ottenere il token di accesso da ACS tramite l'asserzione SAML?
String headerValue = string.Format("WRAP access_token=\"{0}\"", securityToken);
WebClient client = new WebClient();
client.Headers.Add("Authorization", headerValue);
using (Stream stream = client.OpenRead(@"http://xxx.cloudapp.net/xxx.svc/users"))
using (StreamReader reader = new StreamReader(stream))
{
String response = reader.ReadToEnd();
}
Funziona in un certo senso non riesce per un endpoint non esistente, per esempio. Quindi il servizio è lì (protetto), il modulo token e il token validator sul lato server vengono chiamati e il token passa attraverso. Quindi non è quello. Ma comunque il problema è che la risposta contiene HTML di una pagina di login (quella con l'elenco dei provider di identità in essa contenuti). Sembra che la convalida del token sia OK, non è ancora sufficiente per la sicurezza.
Cosa devo fare ora per ricevere i miei dati da un servizio? Qualche suggerimento?
Scenario: http://tinyurl.com/WcfRestSaml
Aggiornamento: Ho incluso link verso un quadro di scenario che sto cercando di realizzare.
Aggiornamento 2: OK, sono passato a Saml2, ma si è verificato lo stesso errore. Poi ho scoperto che ho bisogno dell'asserzione per ricevere il token di accesso. Così ho fatto:
WebClient client = new WebClient { BaseAddress = string.Format("https://{namespace}.accesscontrol.windows.net") };
NameValueCollection parameters = new NameValueCollection
{
{ "wrap_assertion_format", "SAML" },
{ "wrap_assertion", securityToken },
{ "wrap_scope", "http://{our}.cloudapp.net/" }
};
Byte[] responseBytes = client.UploadValues("WRAPv0.9", parameters);
String response = Encoding.UTF8.GetString(responseBytes);
Questo restituisce l'ennesimo errore come bene però:
Error:Code:401:SubCode:T0:Detail:ACS50008: SAML token is invalid.:TraceID:1d3774fa-a5e6-3e3b-a5e5-5a0bde6e0771:TimeStamp:2013-06-06 16:18:05Z
Ma sembra che questo dovrebbe restituire il mio token di accesso desiderato.
Aggiornamento 3: niente aiuta, nessun luogo per raccogliere le informazioni, dannazione. Sto postando un token completo su una possibilità cieca qualcuno noterà che qualcosa è sbagliato almeno (ho rimosso le informazioni sensibili però).
<Assertion ID="_541a71ba-1e00-478c-8d2b-0beac3a35d35" IssueInstant="2013-06-07T11:38:31.741Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
<Issuer>https://{removed}.accesscontrol.windows.net/</Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#_541a71ba-1e00-478c-8d2b-0beac3a35d35">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>{removed}</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>{removed}</ds:SignatureValue>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>{removed}</X509Certificate>
</X509Data>
</KeyInfo>
</ds:Signature>
<Subject>
<NameID>https://www.google.com/accounts/o8/id?id={removed}</NameID>
<SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer" />
</Subject>
<Conditions NotBefore="2013-06-07T11:38:31.694Z" NotOnOrAfter="2013-06-07T12:38:31.694Z">
<AudienceRestriction>
<Audience>http://{removed}.cloudapp.net/</Audience>
</AudienceRestriction>
</Conditions>
<AttributeStatement>
<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress">
<AttributeValue>{removed}</AttributeValue>
<AttributeValue>https://www.google.com/accounts/o8/id?id={removed}</AttributeValue>
<AttributeValue>{removed}</AttributeValue>
</Attribute>
<Attribute Name="http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider">
<AttributeValue>Google</AttributeValue>
</Attribute>
</AttributeStatement>
</Assertion>
Abbiamo risolto con il supporto tecnico Microsoft, è stato causato dal fatto, il servizio era al di là della federazione passiva, e il processo non piace, ovviamente. L'ho risolto creando una busta di asserzione per il token di asserzione SAML2, in questo modo ha "simulato" l'attività del browser, e funziona bene e funziona bene anche con la federazione passiva (a causa della busta WS-TRUST). –
SmartK8
Ecco un'altra risposta che mostra come dovrebbe apparire il payload http://stackoverflow.com/a/17174563/31299 – Josh
Sì, ma il mio formato era corretto. Come ho detto il mio problema era che era dietro la federazione passiva. Aveva bisogno di passarlo prima e poi collegato ad ACS. È tutto risolto e funziona bene ora. – SmartK8