Откуда ComponentSpace Saml 2.0 берет ключ для шифрования утверждений

Когда я запускаю следующий код (используется библиотека ComponentSpace Saml 2.0), Fiddler показывает мне, что значение SAMLRequest зашифровано, как это <input type="hidden" name="SAMLRequest" value="PHNhbWxwOkF1dGhu....">, что является вполне ожидаемым поведением. Код реализует первый шаг профиля SSO SAML 2.0 POST. Обратите внимание, что в коде не указан ключ сертификата для любого вида шифрования, поэтому мне интересно, как ComponentSpace lib решает, какой из них выбрать?

   var authnRequest = new AuthnRequest
        {
            Destination = @"https://idpserver/...",
            Issuer = new Issuer(@"https://sp/..."),
            ForceAuthn = false,
            NameIDPolicy = new NameIDPolicy(null, null, true), 
            ProtocolBinding = SAMLIdentifiers.BindingURIs.HTTPPost,
            AssertionConsumerServiceURL = @"https://sp/..."
        };

        var relayState = RelayStateCache.Add(new RelayState(@"https://sp/...", null));

        ServiceProvider.SendAuthnRequestByHTTPPost(
            new HttpResponseWrapper(_context.Response), 
            @"https://idpserver/...", 
            authnRequest.ToXml(), 
            relayState);

Все, что говорится в Википедии, это «значение параметра SAMLRequest - это кодировка base64». Нет информации о том, какой ключ используется для кодирования.


person YMC    schedule 05.09.2012    source источник


Ответы (2)


Извините за недопонимание вашего вопроса. Ваш пример кода сконструировал и отправил запрос аутентификации. Похоже, вы спрашиваете об утверждениях SAML, содержащихся в ответе SAML.

Поставщик удостоверений шифрует утверждение SAML с помощью открытого ключа поставщика услуг. Поставщик услуг расшифрует утверждение, используя свой закрытый ключ.

Если вы хотите увидеть пример этого, взгляните на проект AssertionExample, который демонстрирует шифрование / дешифрование утверждений SAML.

Шаг 2 по предоставленной вами ссылке описывает SP, отправляющий AuthnRequest через HTTP / POST в IdP. При отправке AuthnRequest не используется шифрование XML. XML кодируется с использованием deflate и base-64, но без шифрования. Эта кодировка выполняется за вас, когда вы вызываете ServiceProvider.SendAuthnRequestByHTTPPost.

person ComponentSpace    schedule 05.09.2012

Подписывать запрос аутентификации необязательно.

Чтобы подписать запрос, перед вызовом ServiceProvider.SendAuthnRequestByHTTPPost необходимо сделать что-то вроде следующего:

// Serialize to XML
XmlElement authnRequestElement = authnRequest.ToXml();

// Sign the authn request
SAMLMessageSignature.Generate(authnRequestElement, x509Certificate.PrivateKey, x509Certificate);

// Send the authn request to the IdP
ServiceProvider.SendAuthnRequestByHTTPPost(..., authnRequestElement, ...);

Вы всегда подписываете своим закрытым ключом, а получатель проверяет подпись, используя ваш открытый ключ / сертификат.

person ComponentSpace    schedule 05.09.2012
comment
Спасибо за ответ, но я буквально спросил о шифровании, а не о подписи сообщений. Документация ComponentSpace дает вам исчерпывающую информацию о подписи, поэтому никаких вопросов по этому поводу, но почти ничего о шифровании. Главный вопрос - какой ключ используется для ШИФРОВАНИЯ всех утверждений, как в предоставленном мной коде. - person YMC; 05.09.2012
comment
См. Здесь en.wikipedia.org/wiki/ на шаге 2. чтобы понять, что я имел в виду: ComponentSpace шифрует ‹samlp: AuthnRequest ..› с каким-то ключом. Это какой-то закрытый ключ на машине поставщика услуг, однако IdP должен иметь соответствующий открытый ключ для его расшифровки, поэтому мне нужно знать, какой открытый ключ следует ли мне отправить группе поддержки IdP - person YMC; 05.09.2012