2013-06-05 5 views
5

Я смог получить, расшифровать токен безопасности (SWT) от различных поставщиков удостоверений, настроенных в ACS. Теперь я должен быть - по примеру - в состоянии сделать это:Как получить токен доступа от ACS через утверждение 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(); 
} 

Он работает в некотором смысле это терпит неудачу на несуществующую конечную точку, например. Таким образом, служба там (защищена), модуль токенов и валидатор токенов на стороне сервера вызывается, а токен проходит. Так что дело не в этом. Но в любом случае проблема заключается в том, что ответ содержит HTML-адрес страницы входа (тот, в котором есть список поставщиков идентификаторов). Кажется, что проверка маркера была в порядке, но для безопасности ее еще недостаточно.

Что мне теперь делать, чтобы получать мои данные из службы? Любые намеки?

Сценарий: http://tinyurl.com/WcfRestSaml

Update: Я включил ссылку на картину сценария я пытаюсь достичь.

Обновление 2: Хорошо, я переключился на Saml2, но произошла такая же ошибка. Затем я узнал, что мне нужно утверждение для получения токена доступа. Так что я сделал:

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); 

Это возвращает еще одну ошибку, а хотя:

Error:Code:401:SubCode:T0:Detail:ACS50008: SAML token is invalid.:TraceID:1d3774fa-a5e6-3e3b-a5e5-5a0bde6e0771:TimeStamp:2013-06-06 16:18:05Z

Но мне кажется, что это должно вернуть нужный мне маркер доступа.

Обновление 3: Ничего не помогает, нигде не собирать информацию, черт возьми. Я публикую полный токен при слепом шансе, что кто-то заметит, что что-то не так, по крайней мере (я удалил конфиденциальную информацию, хотя).

<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> 
+0

Мы решили ее с поддержки Microsoft, это было вызвано тем, служба была вне пассивной федерации, и этот процесс не нравится, очевидно. Я решил это, создав конверт для токена утверждения SAML2, таким образом, он «имитировал» активность браузера, и он работает хорошо, а также хорошо работает с пассивной федерацией (из-за WS-TRUST-конверта). – SmartK8

+0

Вот еще один ответ, который показывает, что полезная нагрузка должна выглядеть как http://stackoverflow.com/a/17174563/31299 – Josh

+0

Да, но мой формат был верным. Как я уже сказал, моя проблема была в пассивной федерации. Сначала необходимо передать его, а затем подключить к ACS. Сейчас все решено и работает нормально. – SmartK8

ответ

0

Как было отмечено выше:

We've solved it with Microsoft Support, it was caused by the fact, the service was behind passive federation, and the process doesn't like obviously. I've solved it by creating a <RequestSecurityToken> envelope for the SAML2 assertion token, this way it "simulated" browser activity, and it works well and also plays well with passive federation (due to WS-TRUST envelope).

It needed to pass it first and then it connected to ACS.The problem wasn't in access token or SAML assertion at all. It was caused - as I've pointed out - by the fact that part of website was behind the custom STS federation. The WS Federation module was blocking reception of this token. When I enveloped it in RequestSecurityToken for WS Federation to chew on first. It then passed to ACS as presented in my question.