objective-c – 如何使用NSURLConnection发布SAML响应消息?

objective-c – 如何使用NSURLConnection发布SAML响应消息?,第1张

概述我正在创建一个iPhone应用程序,允许用户与安全的服务器进行交互.但是,要对用户进行身份验证,应用程序需要从服务器通过SAML,用户登录到数据所在的服务器(提供SSO).所以应用程序模仿发送SAML HTTP请求(通常浏览器会照顾). 这个过程使用的是使用Mechanize gem的Ruby,但现在我无法使用NSURLConnection在iPhone上运行它. 我遇到的问题是:似乎NSURLC 我正在创建一个iPhone应用程序,允许用户与安全的服务器进行交互.但是,要对用户进行身份验证,应用程序需要从服务器通过SAML,用户登录到数据所在的服务器(提供SSO).所以应用程序模仿发送SAML http请求(通常浏览器会照顾).

这个过程使用的是使用Mechanize gem的Ruby,但现在我无法使用NSURLConnection在iPhone上运行它.

我遇到的问题是:似乎NSURLConnection没有正确地将base64编码的SAML响应发送到服务器.标志被空格替换,导致服务器端的SAML响应解码失败.使用带有stringByAddingPercentEscapesUsingEnCoding的URL编码会导致相同的解码错误.

这是提取和发送SAML响应的代码:

// Extract the SAML Response from the form that is sent by the serverbody = [[Nsstring alloc] initWithData:[self receivedData]     enCoding:NSUTF8StringEnCoding];Nsstring *searchSAMLResponseStart = @"name=\"SAMLResponse\" value=\"";Nsstring *searchSAMLResponseEnd = @">\n<NOSCRIPT><input TYPE=\"submit\"";NSRange samlResponseStartRange = [body rangeOfString:searchSAMLResponseStart options:0];NSRange samlResponseEndRange = [body rangeOfString:searchSAMLResponseEnd options:0];NSRange range = NSMakeRange (NSMaxrange(samlResponseStartRange),samlResponseEndRange.location - NSMaxrange(samlResponseStartRange) -1);Nsstring* samlResponseString = [body substringWithRange:range];// Construct the SAML POST requestNSURL               *url;NSMutableURLRequest *request;url = [NSURL URLWithString:kSamlPostUrl];request = [NSMutableURLRequest requestWithURL:url];Nsstring *userAgent = kUserAgent;[request setValue:userAgent forhttpheaderFIEld:@"User-Agent"];[request sethttpMethod:@"POST"];Nsstring *post = [@"RelayState=https://example.com&SAMLResponse=" stringByAppendingString:samlResponseString];NSData *postData = [post dataUsingEnCoding:NSUTF8StringEnCoding allowLossyConversion:NO];Nsstring *postLength = [Nsstring stringWithFormat:@"%d",[postData length]];[request setValue:postLength forhttpheaderFIEld:@"Content-Length"];[request setValue:@"application/x-www-form-urlencoded" forhttpheaderFIEld:@"Content-Type"];[request sethttpBody:postData];// Send the request        self.connectionpostsaml = [NSURLConnection connectionWithRequest:request delegate:self];

服务器发送的SAML表单以及从中获取SAML响应的位置如下所示:

<HTML><head><Meta http-EQUIV='PRAGMA' CONTENT='NO-CACHE'><Meta http-EQUIV='CACHE-CONTRol'     CONTENT='NO-CACHE'><Title>SAML 2.0 auto-POST form</Title></head>   <body onLoad="document.forms[0].submit()"><NOSCRIPT>Your browser does not support JavaScript.  Please click the 'Continue' button     below to proceed. <br><br></NOSCRIPT>      <form action="https://sso.example.com/saml2" method="POST">         <input type="hIDden" name="RelayState" value="https://example.com">         <input type="hIDden" name="SAMLResponse"     value="PFJlc3BvbnNliHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIERlc3RpbmF0aW9uPSJodHRwczovL3Nzby5vcG93ZXIuY29tL3NwL0FDUy5zYW1sMiIgSUQ9Il85ZWY0M2MzMGRkZmQ0YzY1ODNiMjgxZjAwNDU5ZWQyMjZmMjQiIElzc3VlSW5zdGFudD0iMjAxMi0wMy0yOFQyMTo0MDowNloiIFZlcnNpb249IjIuMCI+CiAgICA8bnMxOklzc3VlciB4bWxuczpuczE9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0IDXJuOm9hc2lzOm5hbWVzOnRjolNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5wZ2UuY29tPC9uczE6SXNzDWVy(…)cnRpb24+CjwvUmVzcG9uc2U+"><NOSCRIPT><input TYPE="submit" VALUE="Continue"></NOSCRIPT>      </form>   </body></HTML>

以及服务器收到POST请求后产生的错误:

Unable to parse incoming SAML2 message,raw:     PFJlc3BvbnNliHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIERlc3RpbmF0aW9uPSJodHRwczovL3Nzby5vcG93ZXIuY29tL3NwL0FDUy5zYW1sMiIgSUQ9Il9iN2Q5OTZhMmI1MjhiNWRkNjY0YWM4YjUwZmVjM2M2OTMzMWEiIElzc3VlSW5zdGFudD0iMjAxMi0wMy0yOVQyMjowMzoxNVoiIFZlcnNpb249IjIuMCI CiAgICA8bnMxOklzc3VlciB4bWxuczpuczE9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0IDXJuOm9hc2lzOm5hbWVzOnRjolNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5wZ2UuY29tPC9uczE6SXNzDWVyPgogICAgPFN0YXR1cz4KICAgICAgICA8U3RhdHVzQ29kZSBWYWx1ZT0IDXJuOm9hc2lzOm5hbWVzOnRjolNBTUw6Mi4wOnN0YXR1czpTDWNjZXNzIi8 CiAgICA8L1N0YXR1cz4KICAgIDxuczI6QXNz(…)

注意原始响应中的符号如何变为空格.

服务器解码收到的响应并因此用空格替换符号似乎是正常的行为,但是:为什么SAML表单是从浏览器发布的,而不是从NSURLConnection发布的?

为了解决我试过:

>使用不同的编码对SAML响应进行解码和编码.现在使用NSUTF8StringEnCoding,也尝试过:NSASCIIStringEnCoding,NSNEXTSTEPStringEnCoding,NSNonLossyASCIIStringEnCoding,NSUnicodeStringEnCoding
>使用stringByAddingPercentEscapesUsingEnCoding,所以这行代码:

Nsstring * samlResponseString = [body substringWithRange:range];

变为:

Nsstring* samlResponseString = [[body substringWithRange:range] stringByAddingPercentEscapesUsingEnCoding:NSUTF8StringEnCoding];

>为表单使用其他enctype,但服务器甚至不接受这些请求:
多部分/格式数据
纯文本/

我非常感谢你的帮助.先感谢您!

解决方法 我通过post发送base64并通过url编码解决了问题.试试这个:

Nsstring *post = [@"RelayState=https://example.com&SAMLResponse=" stringByAppendingString:        (__brIDge_transfer Nsstring *)CFURLCreateStringByAddingPercentEscapes(NulL,(__brIDge CFStringRef)samlResponseString,NulL,(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",CFStringConvertnsstringencodingToEnCoding(NSUTF8StringEnCoding))];
总结

以上是内存溢出为你收集整理的objective-c – 如何使用NSURLConnection发布SAML响应消息?全部内容,希望文章能够帮你解决objective-c – 如何使用NSURLConnection发布SAML响应消息?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1009170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存