当前位置:  开发笔记 > 编程语言 > 正文

将iPhone应用程序与Shibboleth集成

如何解决《将iPhone应用程序与Shibboleth集成》经验,为你挑选了1个好方法。

有没有人将iPhone应用程序与Shibboleth身份提供程序集成?谷歌搜索没有得到任何东西,所以我直接问大师.

如果以前没有用过,这样做是否可行?



1> 小智..:

两者的答案都是"是的".

我是一个Java人,因此在两周前被问到:

学习Objective-C

编写原生iPhone应用程序

使用Shibboleth以编程方式进行身份验证

下载显示Shibboleth保护的数据文件

......有点令人生畏.没有任何论坛帖子帮忙的复合促使我分享我的经验.

这是一个概述,然后是一些希望非常有用的示例代码.如果这有帮助,请投票给我答案!值得我几个星期的时间:)

对于iPhone上的应用程序来下载Shibbolized资源,需要执行以下操作:

    使用Cocoa中的URL API来提交相关资源的HTTP请求.

    为请求实现委托类:

    回应SP重新指向IdP(Cocoa自动礼貌)

    响应服务器证书信任挑战

    回应用户凭证挑战

    回应错误(如果需要)

    接收身份验证用户的IdP"绑定模板",这是一个HTML表单,用两个参数将用户重定向回SP

    以编程方式HTTP将两个参数从IdP返回到SP.

    Cookie会自动存储并再次由Cocoa提供

    实现第二个URL请求委托以接收最初的请求数据.

以下是Apple和Shibboleth的一些有用的参考资料:

http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html

https://spaces.internet2.edu/display/SHIB2/IdPSPLocalTestInstall

希望我可以包含所有来源以进行快速演示.

ApplicationDelegate.h
----------
#import 
#import "ConsoleViewController.h"

/*
 The application delegate will hold references to the application's UIWindow and a ConsoleViewController.
 The console does all of the interesting Shibboleth activities.
*/
@interface ApplicationDelegate : NSObject  {

 UIWindow *window;
 ConsoleViewController *consoleViewController;
}


@end

ApplicationDelegate.m
----------
#import "ApplicationDelegate.h"
#import "ConsoleViewController.h"

/*
 The implementation for the ApplicationDelegate initializes the console view controller and assembles everything.
 The console does all of the interesting Shibboleth activities.
 */
@implementation ApplicationDelegate


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

 // Initialize the console.
 consoleViewController = [[ConsoleViewController alloc] init];

 window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
 [window setBackgroundColor:[UIColor lightGrayColor]];
 [window addSubview:[consoleViewController view]];

 [window makeKeyAndVisible];
}


- (void)dealloc {
    [window release];
 [ConsoleViewController release];
    [super dealloc];
}


@end

ConsoleController.h
----------
#import 
#import 

/*
 The ConsoleViewController's interface declares references to the network data used in negotiating with Shibboleth
 and a UITextView used to display the final result or errors.
 */
@interface ConsoleViewController : UIViewController {

 NSMutableData *responseData;
 NSString *responseString;
 UITextView *console;
}

@end

ConsoleController.m
----------
#import "ApplicationDelegate.h"
#import "ConsoleViewController.h"


/*
 This delegate is used when making the second HTTP request with Shibboleth.  If you're just getting here, start
 by reading the comments for ConsoleViewController below.

 All we need to do now is receive the response from the SP and display it.
 If all goes well, this should be the secured page originally requested.
 */
@interface AuthenticationRedirectDelegate : NSObject {

 NSMutableData *authResponseData;
 NSString *authResponseString;
 UITextView *console;
}

@property (nonatomic retain) UITextView *console;

@end


/*
 Refer to the comments for the interface above.
 */
@implementation AuthenticationRedirectDelegate

@synthesize console;

-(id)init {
 authResponseData = [[NSMutableData alloc] retain];
 return self;
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
 [authResponseData setLength:0];
}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
 [authResponseData appendData:data];
}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
 [console setText:[error localizedDescription]]; 
}


/*
 Once the data is received from Shibboleth's SP, display it.
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {  

 authResponseString = [[NSString alloc] initWithData:authResponseData encoding:NSUTF8StringEncoding]; 
 [console setText:authResponseString]; 
 [connection release];
}


@end


/*
 The implementation of the ConsoleViewController, and AuthenticationRedirectDelegate above, contain the real logic of
 this Shibboleth exercise.  The ConsoleViewController performs the following:
 1. Prepare the initial HTTP request to a Shibboleth protected resource.
 2. Act as the delegate whilst Cocoa's URL Loading API receives the HTTP Response.
 NOTE: We instruct Cocoa in advance to take care of the SP redirecting to the IdP, accepting the server certificate,
 and submitting the user credentials
 3. Once the HTTP Response is finished loading, parse the 
"]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:12.0]; [[NSURLConnection alloc] initWithRequest:request delegate:self]; /* Control flows to the delegate methods below */ } /* Refer to Apple's docs on the URL Loading System for details. http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html */ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [responseData setLength:0]; } /* Refer to Apple's docs on the URL Loading System for details. http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html */ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [responseData appendData:data]; } /* This implementation in the delegate let's Cocoa trust my SP Web Server's self-signed certificate. TODO: You will want to harden this for production use. Refer to Apple's docs on the URL Loading System for details. http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html */ - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust] || [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]; } /* This implementation for the delegate does two things: 1. Respond to challenges for my server's self-signed certificate 2. Respond to the IdP's challenge for the username and password. TODO: Enter your own username and password here. Refer to Apple's docs on the URL Loading System for details. http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html */ - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { // TODO: Enter the correct username and password below. /* WARNING: Using an incorrect user name and password will result in your application being re-challenged by the IdP. Cocoa will return to this function in a never-ending loop. This can result in the message "NSPosixErrorDomain Too many open files". You'll need to perform additional coding to handle this. */ if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; else if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) [challenge.sender useCredential:[NSURLCredential credentialWithUser:@"" password:@"" persistence:NSURLCredentialPersistenceNone] forAuthenticationChallenge:challenge]; else [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; } /* You may wish to add more code here to log errors. Refer to Apple's docs on the URL Loading System for details. http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html */ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [console setText:[error localizedDescription]]; } /* Once Cocoa has received a (hopefully) authenticated response from the IdP, we parse out the relevant pieces and prepare to HTTP POST them back to the SP as specified by the IdP in the "]; NSString *SAMLResponse = [ConsoleViewController substringFromString:responseString BetweenOpenToken:@"SAMLResponse\" value=\"" AndCloseToken:@"\"/>"]; NSString *formAction = [ConsoleViewController substringFromString:responseString BetweenOpenToken:@"

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有