Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 661095
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 13, 20262026-05-13T23:13:49+00:00 2026-05-13T23:13:49+00:00

Has anyone integrated an iPhone application with a Shibboleth Identity Provider? Googling did not

  • 0

Has anyone integrated an iPhone application with a Shibboleth Identity Provider? Googling did not come up with anything so I am asking the gurus directly.

If it has not been previously dones, is it feasible to do so?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-13T23:13:50+00:00Added an answer on May 13, 2026 at 11:13 pm

    The answer to both is “Yes.”

    I’m a Java guy, so being asked two weeks ago to:

    • Learn Objective-C
    • Write an native iPhone App
    • Authenticated programmatically with Shibboleth
    • Download an display Shibboleth protected datafile

    …Was a little daunting. Compound that with the absence of any forum posts to help out has prompted me to share my experience.

    Here’s an overview followed by some hopefully very helpful sample code. Please vote for my answer if this helps! It worth a few weeks of my time 🙂

    For an application on the iPhone to download Shibbolized resources, the following needs to happen:

    1. Use the URL API’s in Cocoa to submit the HTTP request for the resource in question.
    2. Implement a delegate class for the request to:
    3. Respond to the SP re-direct to the IdP (automatic courtesy of Cocoa)
    4. Respond to server certificate trust challenges
    5. Respond to user credential challenges
    6. Respond to errors (if needed)
    7. Receive IdP’s “binding template” for the authenticated user, an HTML form which re-directs the user back to the SP with two parameters
    8. Programmatically HTTP POST the two parameters from the IdP back to the SP.
    9. Cookies are automatically stored and forwards courtesy of Cocoa again
    10. Implement a second URL Request delegate to receive the originally request data.

    Here are some useful references from Apple and Shibboleth:

    • http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html
    • https://spaces.internet2.edu/display/SHIB2/IdPSPLocalTestInstall

    And hopefully I can include all the source for a quick demonstration.

    ApplicationDelegate.h
    ----------
    #import <UIKit/UIKit.h>
    #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 <UIApplicationDelegate> {
    
     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 <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    /*
     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 <form action, RelayState and SAMLResponse from the IdP's
     response
     4. Call a utility method to prepare a second HTTP POST Request to the <form action/SP with the IdP's parameters
     NOTE: We do not need to transfer over any of Shibboleth's cookies, since Cocoa is doing this automatically
     5. Use a new instance of AuthenticationRedirectDelegate to receive the POST's response, which should be the secured
     page originally requested.
     6. Display the final content in the UITextView known as console.
     */
    @implementation ConsoleViewController
    
    
    /*
     A handy utility method for extracting a substring marked by two provided token strings.
     Used in parsing the HTML form returned by the IdP after the first HTTP Request.
     */
    +(id)substringFromString:(NSString *)source BetweenOpenToken:(NSString *)openToken AndCloseToken:(NSString *)closeToken {
    
     NSUInteger l = [source length];
     NSUInteger openTokenLen = [openToken length];
    
     NSUInteger openTokenLoc = ([source rangeOfString:openToken]).location;
     NSUInteger valueLoc = openTokenLoc + openTokenLen;
     NSRange searchRange = NSMakeRange(valueLoc, l - valueLoc);
     NSUInteger closeTokenLoc = ([source rangeOfString:closeToken options:NSCaseInsensitiveSearch range:searchRange]).location;
     searchRange = NSMakeRange(valueLoc, closeTokenLoc - valueLoc);
     NSString *result = [source substringWithRange:searchRange];
    
     return result;
    }
    
    
    /*
     This function takes the three properties returned by the IdP after the first HTTP request and 
     HTTP POSTs them to the SP as specified by the IdP in the "url" parameter.
     */
    -(void)authReturnTo:(NSURL *)url WithRelay:(NSString *)relayState AndSAML:(NSString *)samlResponse {
    
     // Here we assemble the HTTP POST body as usual.
     NSString *preBody = [[NSString alloc] initWithString:@"RelayState="];
     preBody = [preBody stringByAppendingString:relayState];
     preBody = [preBody stringByAppendingString:@"&"];
     preBody = [preBody stringByAppendingString:@"SAMLResponse="];
     preBody = [preBody stringByAppendingString:samlResponse];
    
     /* The SAMLResponse parameter contains characters (+) that the SP expects to be URL encoded.
      Here we simply manually URL encode those characters.  You may wish to harden this with proper
      URL encoding for production use.
      */
     NSString *httpBody = [preBody stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
     NSData *httpBodyData = [httpBody dataUsingEncoding:NSUTF8StringEncoding];
    
     NSString *httpContentLength = [NSString stringWithFormat:@"%d", [httpBodyData length]];
    
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                  cachePolicy:NSURLRequestReloadIgnoringCacheData
                  timeoutInterval:12.0];
     [request setHTTPMethod:@"POST"];
     [request setValue:httpContentLength forHTTPHeaderField:@"Content-Length"];
     [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    
     [request setHTTPBody:httpBodyData];
    
     // Submit the HTTP POST using the second delegate class to receive the response
     AuthenticationRedirectDelegate *delegate = [[AuthenticationRedirectDelegate alloc] init];
     delegate.console=console;
     [[NSURLConnection alloc] initWithRequest:request delegate:delegate];
    }
    
    
    /*
     When this UIViewController finishes loading, automatically prepare and send a request to the Shibboleth SP Web Server
     for a secured resource.
     */
    - (void)viewDidLoad {
     [super viewDidLoad];
    
     console = [[UITextView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
     [[self view] addSubview:console];
    
     responseData = [[NSMutableData data] retain];
    
     // TODO: Enter your own URL for a Shibboleth secured resource.
     NSURL *url = [NSURL URLWithString:@"<URL>"];
    
     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:@"<USERNAME>" password:@"<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 <form action attribute.
    
     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)connectionDidFinishLoading:(NSURLConnection *)connection {  
     [connection release];
     responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    
     if([responseString rangeOfString:@"SAMLResponse"].length < 1)
     {
      [console setText:[@"Unexpected response:\n]n" stringByAppendingString:responseString]];
      return;
     }
    
     NSString *relayState = [ConsoleViewController substringFromString:responseString BetweenOpenToken:@"RelayState\" value=\"" AndCloseToken:@"\"/>"];
     NSString *SAMLResponse = [ConsoleViewController substringFromString:responseString BetweenOpenToken:@"SAMLResponse\" value=\"" AndCloseToken:@"\"/>"];
     NSString *formAction = [ConsoleViewController substringFromString:responseString BetweenOpenToken:@"<form action=\"" AndCloseToken:@"\""];
     NSURL *formActionURL = [[NSURL alloc] initWithString:formAction];
     [self authReturnTo:formActionURL WithRelay:relayState AndSAML:SAMLResponse];
    }
    
    
    @end
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Has anyone had any experience in saving app preferences (within app, not in Settings
Has anyone integrated BeautifulSoup with ASP.NET/C# (possibly using IronPython or otherwise)? Is there a
Has anyone managed to run wcf successfully in 2.0 integrated mode on IIS7 when
Has anyone integrated with Google Latitude (or any Google API, for that matter) with
Has anyone integrated a local copy of gitorious with Hudson? Specifically, linking the sha1
Has anyone integrated ELMAH into their SharePoint environment? I suppose it's possible as it's
Has anyone integrated Socialize (getsocialize.com) with PhoneGap? I'm working on a PhoneGap app, and
Has anyone successfully integrated NServiceBus with WIF for message authentication/authorization?
Has anyone successfully integrated Apache Mahout with Neo4j as a datastore? If so, how
Has anyone integrated google docs into their iOS app? Having gone through the example

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.