Ответы SAML поставляются с подписью и открытым ключом для этой подписи.
Вы можете использовать открытый ключ, чтобы убедиться, что содержимое ответа SAML соответствует ключу, другими словами, что ответ определенно получен от того, кто имеет соответствующий закрытый ключ с открытым ключом в сообщении, и ответ имеет не был подделан.
Я не знаю, с какими технологиями вы работаете, но в .Net вы можете проверить это так:
// load a new XML document
var assertion = new XmlDocument { PreserveWhitespace = true };
assertion.LoadXml("The SAML XML that you were sent");
// use a namespace manager to avoid the worst of xpaths
var ns = new XmlNamespaceManager(assertion.NameTable);
ns.AddNamespace("samlp", @"urn:oasis:names:tc:SAML:2.0:protocol");
ns.AddNamespace("asrt", @"urn:oasis:names:tc:SAML:2.0:assertion");
ns.AddNamespace("dsig", @"http://www.w3.org/2000/09/xmldsig#");
// get nodes down to the signature
var responseNode = assertion.SelectSingleNode("/samlp:Response", ns);
var assertionNode = responseNode.SelectSingleNode("asrt:Assertion", ns);
var signNode = assertionNode.SelectSingleNode("dsig:Signature", ns);
// load the XML signature
var signedXml = new SignedXml(assertion.DocumentElement);
signedXml.LoadXml(signNode as XmlElement);
// get the certificate, basically:
// signedXml.KeyInfo[0].Certificates[0]
// ...but with added casting
var certificate = GetFirstX509Certificate(signedXml);
// check the key and signature match
bool isSigned = signedXml.CheckSignature(certificate, true);
Это просто проверяет, что сообщение от того, кто оно говорит. Вам нужна дополнительная проверка того, что сообщение пришло от кого-то, кому вы доверяете, и эта проверка медленнее - она должна включать отзыв и может потребоваться проверка всей цепочки сертификатов.
Обычно это список открытых ключей, от которых вы принимаете ответы SAML.
Затем вы можете проверить, что это сообщение не было подделано и принадлежит кому-то, кому вы доверяете, поэтому вы можете авторизовать данные пользователя, указанные в предоставленных атрибутах SAML.
Вы могли бы уже иметь открытый ключ, что означает, что подпись не должна снова включать открытый ключ, но вы также можете иметь несколько возможных известных отправителей или даже цепочку известных отправителей.
Например, у вас может быть два доверенных поставщика - в любом случае вы проверяете, что сообщение не было подделано, прежде чем проверять, доверяете ли вы одному из поставщиков. Если ключ отсутствует в подписи, утверждения могут быть немного меньше, но теперь вам нужно заранее знать, от какого поставщика удостоверений получено утверждение.
Итак, действительно, есть две основные причины, по которым открытый ключ находится в подписи:
- Проверка несанкционированного доступа выполняется быстрее, чем проверка личности, и ее можно изолировать, если известен открытый ключ.
- Несколько идентификаторов гораздо легче поддерживать, если ключ находится в утверждении.