Я пытаюсь настроить SAML2 IdP Salesforce
в качестве внешнего поставщика в IdentityServer3. Я использую библиотеку SustainSys / Saml2 . Итак, для целей тестирования я скачал SampleIdentityServer3 . и настроил SAML2 IdP как показано ниже
private void ConfigureSaml2(IAppBuilder app, string signInAsType)
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
var options = new Saml2AuthenticationOptions(false)
{
SPOptions = new SPOptions
{
EntityId = new EntityId("http://localhost:4589/IdSrv3/Saml2"),
MinIncomingSigningAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
},
SignInAsAuthenticationType = signInAsType,
Caption = "SAML2p",
};
UseIdSrv3LogoutOnFederatedLogout(app, options);
options.SPOptions.ServiceCertificates.Add(new X509Certificate2(
AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/Sustainsys.Saml2.Tests.pfx"));
var idp = new IdentityProvider(
new EntityId("https://XXXXXX-dev-ed.my.salesforce.com"),
options.SPOptions)
{
MetadataLocation = "https://XXXXXX-dev-ed.my.salesforce.com/.well-known/samlidp.xml",
LoadMetadata = true,
};
options.IdentityProviders.Add(idp);
app.UseSaml2Authentication(options);
}
Обратите внимание, что если я не установлю MinIncomingSigningAlgorithm
на sh1, то библиотека SustainSys выдаст ошибку.
Sustainsys.Saml2.Exceptions.InvalidSignatureException: подпись
алгоритм http://www.w3.org/2000/09/xmldsig#rsa-sha1 слабее, чем
минимальный принятый
http://www.w3.org/2001/04/xmldsig-more#rsa-sha256. Если вы хотите
разрешить этот алгоритм подписи, используйте minIncomingSigningAlgorithm
атрибут конфигурации.
Поэтому я установил MinIncomingSigningAlgorithm
на "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
, чтобы избавиться от ошибки.
Но тогда я получаю другую ошибку
Sustainsys.Saml2.Exceptions.InvalidSignatureException: подпись
проверено правильно с ключом, содержащимся в подписи, но это
ключ не является доверенным.
на основе проблемы # 493 # 735 сертификат в метаданных должен совпадать с сертификатом в ответе SAML2.
В метаданных сертификатом является (начальные и конечные значения уведомления)
<ds:X509Data>
<ds:X509Certificate>
MIIGk... removed from brevity....tmv6J1g==
</ds:X509Certificate>
</ds:X509Data>
Но в ответе SAML2 (который регистрируется библиотекой SustainSys)
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://localhost:4589/IdSrv3/Saml2/Acs" ID="_19fd2d8d9aab0401f56fXXXXXXXXX" InResponseTo="id473a52c49f194bXXXXXXXXX" IssueInstant="2018-08-27T20:10:04.296Z" Version="2.0">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://XXXXXXX-dev-ed.my.salesforce.com</saml: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/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_19fd2d8d9aab0401f56f642dXXXXXXXXXXXXX">
<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#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="ds saml samlp" /></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>fQiiyd0T57Ztr5BAfMFe9MTrhY0=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
B6hndlsBgY45J+hm8My2gPVo....removed for brevity....YT88ajt7jQ==
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIENz... remove for brevity....y2Ul24Jyc4V/jJN
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:AuthnFailed" />
</samlp:Status>
</samlp:Response>
смотрит на X509Certificate
значение в метаданных и в ответе SAML2 они не совпадают.
Вопрос
Соответствует ли значение X509Certificate
в ответе SAML2 значению X509Certificate
в метаданных? Если да, то почему библиотека SustainSys не может всегда использовать значение X509Certificate
из ответа SAML2?
Обновление
Просто чтобы посмотреть, будет ли работать соответствие значений, я сохранил значение сертификата из ответа SAML2 в отдельный файл .cer
. Затем в файле KeyInfoSerializer.cs я обновил метод ReadX509Certificate
(этот метод загружает сертификат из метаданных)
private static SecurityKeyIdentifierClause ReadX509Certificate(XmlReader reader)
{
reader.ReadStartElement("X509Certificate", SignedXml.XmlDsigNamespaceUrl);
((XmlDictionaryReader)reader).ReadContentAsString();
var cer = new X509Certificate2(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/salesforcepublickey.cer");
var clause = new X509RawDataKeyIdentifierClause(cer);
reader.ReadEndElement();
return clause;
}
Тем не менее, он по-прежнему выдает ошибку The signature verified correctly with the key contained in the signature, but that key is not trusted.