这个过程使用的是使用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响应消息?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)