का उपयोग कर 'HTTP रीडायरेक्ट बाइंडिंग' SAML अनुरोध को सही ढंग से कैसे तैयार करूं, मुझे HTTP रीडायरेक्ट बाइंडिंग विधि का उपयोग करके एक एसपी शुरू किया SAML 2.0 प्रमाणीकरण लेनदेन बनाना होगा। यह पता चला है कि यह काफी आसान है। बस आईडीपी यूआरआई प्राप्त करें और एक क्वेरी-स्ट्रिंग पैरा SAMLRequest
को संयोजित करें। परम एक्सएमएल का एन्कोडेड ब्लॉक है जो SAML अनुरोध का वर्णन करता है। अब तक सब ठीक है।मैं सी #
समस्या तब होती है जब SAML को क्वेरी स्ट्रिंग पैरा में परिवर्तित किया जाता है। मेरा मानना है कि तैयारी की इस प्रक्रिया को होना चाहिए:
- , SAML- स्ट्रिंग बिल्ड
- कम्प्रेस इस स्ट्रिंग
- बेस 64 एन्कोड स्ट्रिंग
- UrlEncode स्ट्रिंग।
SAML अनुरोध
<samlp:AuthnRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="{0}"
Version="2.0"
AssertionConsumerServiceIndex="0"
AttributeConsumingServiceIndex="0">
<saml:Issuer>URN:xx-xx-xx</saml:Issuer>
<samlp:NameIDPolicy
AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>
कोड
private string GetSAMLHttpRedirectUri(string idpUri)
{
var saml = string.Format(SAMLRequest, Guid.NewGuid());
var bytes = Encoding.UTF8.GetBytes(saml);
using (var output = new MemoryStream())
{
using (var zip = new DeflaterOutputStream(output))
{
zip.Write(bytes, 0, bytes.Length);
}
var base64 = Convert.ToBase64String(output.ToArray());
var urlEncode = HttpUtility.UrlEncode(base64);
return string.Concat(idpUri, "?SAMLRequest=", urlEncode);
}
}
मुझे लगता है संपीड़न इसके लिए जिम्मेदार किसी भी तरह है। मैं DeflaterOutputStream
कक्षा का उपयोग SharpZipLib से कर रहा हूं जो कि एक उद्योग मानक डिफ्लेट-एल्गोरिदम लागू करने वाला है, इसलिए शायद यहां कुछ सेटिंग्स हैं जिनमें मुझे गलत है?
एन्कोडेड आउटपुट का परीक्षण इस SAML2.0 Debugger (इसका एक उपयोगी ऑनलाइन रूपांतरण टूल) का उपयोग करके किया जा सकता है। जब मैं इस उपकरण का उपयोग करके अपना आउटपुट डीकोड करता हूं तो यह बकवास के रूप में आता है।
इसलिए सवाल यह है: क्या आप जानते हैं कि SAML स्ट्रिंग को सही ढंग से डिफलेटेड और एन्कोडेड SAMLRequest क्वेरी-param में कैसे परिवर्तित किया जाए?
आप
संपादित करें 1
स्वीकार किए जाते हैं जवाब नीचे समस्या का जवाब देता है धन्यवाद। यहां अंतिम कोड है जो सभी अनुवर्ती टिप्पणियों और उत्तरों द्वारा सही किया गया है।
एनकोड SAMLRequest - कार्य संहिता
private string GenerateSAMLRequestParam()
{
var saml = string.Format(SAMLRequest, Guid.NewGuid());
var bytes = Encoding.UTF8.GetBytes(saml);
using (var output = new MemoryStream())
{
using (var zip = new DeflateStream(output, CompressionMode.Compress))
{
zip.Write(bytes, 0, bytes.Length);
}
var base64 = Convert.ToBase64String(output.ToArray());
return HttpUtility.UrlEncode(base64);
}
}
SAMLRequest
चर SAML इस सवाल के शीर्ष पर दिखाया शामिल हैं।
डिकोड SAMLResponse - कार्य संहिता
private string DecodeSAMLResponse(string response)
{
var utf8 = Encoding.UTF8;
var bytes = utf8.GetBytes(response);
using (var output = new MemoryStream())
{
using (new DeflateStream(output, CompressionMode.Decompress))
{
output.Write(bytes, 0, bytes.Length);
}
var base64 = utf8.GetString(output.ToArray());
return utf8.GetString(Convert.FromBase64String(base64));
}
}
मैं आपके "डीकोड SAMLResponse - वर्किंग कोड" का उपयोग करने में असमर्थ था जिस तरह से लिखा गया है। मुझे इनपुट मेमोरीस्ट्रीम से इनपुट अलग करना पड़ा। मुझे DeflateStream करने से पहले UrlDecode और Convert.FromBase64String (...) भी करना पड़ा। बस सोचा कि अगर मैं अगले व्यक्ति की मदद करता हूं तो मैं एक नोट बनाउंगा। –
क्या आप अपना कामकाजी कोड पोस्ट कर सकते हैं। – biofractal
हे रैंडल, क्या आप "डीकोड SAMLResponse - वर्किंग कोड" में किए गए परिवर्तनों के लिए कोड प्रदान कर सकते हैं? यह बहुत सराहना की जाएगी! धन्यवाद – Naner