Tôi cần tạo giao dịch Xác thực SAML 2.0 do SP bắt đầu bằng phương thức Ràng buộc Chuyển hướng HTTP. Hóa ra điều này khá dễ dàng. Chỉ nhận được URI IdP và nối một tham số chuỗi truy vấn đơn SAMLRequest
. Tham số là khối mã hóa xml mô tả yêu cầu SAML. Càng xa càng tốt.Làm cách nào để chuẩn bị chính xác yêu cầu SAML 'Chuyển hướng HTTP' bằng cách sử dụng C#
Sự cố xảy ra khi chuyển đổi SAML thành tham số chuỗi truy vấn. Tôi tin rằng quá trình này chuẩn bị nên là:
- Xây dựng một chuỗi SAML
- Compress chuỗi này
- Base64 mã hóa chuỗi
- URLEncode chuỗi.
Các SAML Yêu cầu
<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>
Bộ luật
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);
}
}
tôi nghi ngờ nén là bằng cách nào đó để đổ lỗi. Tôi đang sử dụng các lớp học DeflaterOutputStream
từ SharpZipLib đó là nghĩa vụ phải thực hiện một tiêu chuẩn công nghiệp deflate-thuật toán vì vậy có lẽ có một số cài đặt ở đây tôi đã sai?
Đầu ra được mã hóa có thể được kiểm tra bằng cách sử dụng SAML2.0 Debugger (một công cụ chuyển đổi trực tuyến hữu ích của nó). Khi tôi giải mã đầu ra của tôi bằng cách sử dụng công cụ này nó đi ra như vô nghĩa.
Do đó, câu hỏi là: Bạn có biết cách chuyển đổi chuỗi SAML thành tham số truy vấn SAMLRequest được mã hóa và được mã hóa chính xác không?
Cảm ơn bạn
EDIT 1
Câu trả lời được chấp nhận dưới đây đưa ra câu trả lời cho vấn đề này. Đây là mã cuối cùng được sửa chữa bởi tất cả các ý kiến và câu trả lời tiếp theo.
Encode SAMLRequest - Mã Working
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);
}
}
Biến SAMLRequest
chứa SAML hiển thị ở phía trên cùng của câu hỏi này.
Giải mã SAMLResponse - Mã Working
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));
}
}
Tôi không thể sử dụng "Mã SAMLResponse giải mã - Mã làm việc" theo cách viết. Tôi đã phải tách đầu vào từ đầu ra MemoryStream. Tôi cũng đã phải UrlDecode và Convert.FromBase64String (...) trước khi thực hiện DeflateStream. Chỉ nghĩ rằng tôi sẽ ghi chú trong trường hợp nó giúp người tiếp theo. –
Bạn có thể đăng mã làm việc của bạn được không. – biofractal
Hey Randall, bạn có thể cung cấp mã cho những thay đổi bạn đã thực hiện cho "Giải mã SAMLResponse - Mã làm việc" không? Điều đó sẽ được nhiều đánh giá cao! Cảm ơn – Naner