मैं ASP.Net में पोस्ट प्रमाणीकरण को संभालने के लिए एक SAML 2.0 प्रतिक्रिया पार्सर लिख रहा हूँ के खिलाफ एक X509Certificate2 सत्यापित करने के लिए (सी # और MVC में है, लेकिन यह कम प्रासंगिक है)।कैसे एक X509Certificate2Collection श्रृंखला
तो मेरे पास .p7b
फ़ाइल को सत्यापित करने के लिए X509Certificate2Collection
और एक नमूना दावा - एक बेस 64 एन्कोडेड SAML प्रतिक्रिया में पढ़ा जा सकता है।
आदर्श रूप से मैं WSSecurityTokenSerializer
, लेकिन that fails में निर्मित का उपयोग करना चाहता हूं, इसलिए मैं काम करने का एक तरीका ढूंढ रहा हूं।
मैं एक्सएमएल पढ़ रहा हूँ के बजाय सीधे:
// get the base 64 encoded SAML
string samlAssertionRaw = GetFromHttpRequest();
// load a new XML document
var assertion = new XmlDocument { PreserveWhitespace = true };
assertion.LoadXml(samlAssertionRaw);
// 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("saml", @"urn:oasis:names:tc:SAML:2.0:assertion");
ns.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl);
// get the signature XML node
var signNode = assertion.SelectSingleNode(
"/samlp:Response/saml:Assertion/ds:Signature", ns);
// load the XML signature
var signedXml = new SignedXml(assertion.DocumentElement);
signedXml.LoadXml(signNode as XmlElement);
// get the certificate, basically:
// signedXml.KeyInfo.OfType<KeyInfoX509Data>().First().
// Certificates.OfType<X509Certificate2>().First()
// but with added checks
var certificate = GetFirstX509Certificate(signedXml);
// check the key and signature match
if (!signedXml.CheckSignature(certificate, true))
{
throw new SecurityException("Signature check failed.");
}
// go on and read the SAML attributes from the XML doc
कि बहुत काम करता है, लेकिन सभी यह कर रहा है कि जाँच कर रहा है हस्ताक्षर और SAML प्रतिसाद मैच में X509Certificate2
सार्वजनिक कुंजी। यह किसी भी तरह से सत्यापित नहीं करता है कि यह किससे है, और मुझे SAML प्रमाणीकरण को स्वीकार करने से पहले ऐसा करने की आवश्यकता है।
SAML प्रतिक्रिया में प्राप्त प्रमाणपत्र की जांच करने के दो तरीके दिखाई देते हैं - मैं certificate.Verify()
कर सकता हूं या मैं signedXml.CheckSignature(certificate, false)
हस्ताक्षर के साथ चेक कर सकता हूं।
हालांकि दोनों झूठी वापसी करते हैं।
मुझे लगता है कि इस ऑनलाइन है कर रहे हैं, क्योंकि वे मशीन की दुकान या संभवतः के खिलाफ जाँच की जा रही (मैं कैसे जांच करने के लिए यकीन नहीं है)। मैं उन्हें X509Certificate2Collection
बजाय .p7b
फ़ाइल से लिया गया के खिलाफ जाँच करना चाहते हैं - मशीन पर पंजीकृत प्रमाण पत्र अनदेखा किया जाना चाहिए और सिर्फ .p7b
प्रमाण पत्र की जाँच की।
या तो Verify
या CheckSignature
विधियों को पास करने का कोई तरीका नहीं दिखता है।
इस अधिकार की जांच है SAML प्रतिसाद पर कर रही हैं?
वहाँ किसी भी तरह से .p7b
प्रमाण पत्र तरह से मैं चाहता हूँ उपयोग करने के लिए है?
GetFirstX509 प्रमाण पत्र क्या करता है? – theycallmemorty
मैंने यहां एक समान प्रश्न पूछा: http://security.stackexchange.com/questions/3905/verify-saml-response-is-from-a-trusted-ource लेकिन आखिर में आपकी पोस्ट पर समाप्त हो गया क्योंकि मेरे पास CheckSignature – theycallmemorty
@theycallmemorty के साथ एक ही समस्या - मैं टिप्पणियों में व्याख्या करने की कोशिश करता हूं, लेकिन यह 'signXml.KeyInfo [0] करता है। प्रमाणपत्र [0] X509Certificate2' के रूप में, लेकिन चेक और कास्ट के साथ। – Keith