8

我为 iPhone 制作了一个简单的 SharePoint 客户端应用程序,它需要访问一些 SharePoint Web 服务(主要是 /_vti_bin/Lists.asmx)。我无法弄清楚如何在较新的 SharePoint 环境(例如 Office365)上执行此操作。

使用具有基于表单的身份验证的旧 BPOS 环境,我能够通过简单地实现didReceiveAuthenticationChallenge方法对这些服务进行身份验证;

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
NSURLCredential *newCredential = [NSURLCredential credentialWithUser:username
                                               password:password
                                            persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:newCredential
       forAuthenticationChallenge:challenge];
}

这显然不再适用于具有声明身份验证的 SharePoint 网站,因此我进行了一些研究,发现我需要FedAuth将 cookie 附加到请求中。

http://msdn.microsoft.com/en-us/library/hh147177.aspx

根据这篇文章,使用 .NET 应用程序,似乎可以FedAuth使用 WININET.dll 检索那些 HTTPOnly cookie,但我想这在 iPhone 上不可用?

然后,我看到SharePlus应用程序UIWebView首先在浏览器屏幕上显示并让用户登录到他们的 Office365 帐户(这与上面文章的“为远程身份验证启用用户登录”部分中解释的概念相同)。

因此,我尝试查看是否可以FedAuth通过登录 Office365 帐户以某种方式访问​​这些 cookie UIWebView,但[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]没有让我访问 HTTPOnly cookie。

有没有一种方法可以在 iPhone 应用程序上实现声明身份验证,而不需要指定的中间 .NET 服务来处理身份验证,或者要求用户关闭这些 cookie 上的 HTTPOnly 属性?

抱歉,我对 SharePoint 还很陌生,所以我什至可能没有找到正确的方向,但如果有任何关于让声明身份验证在 iPhone 应用程序上工作的建议,我将不胜感激。提前致谢!

4

1 回答 1

2

我自己已经弄清楚了。不得不嘲笑我自己的愚蠢和不耐烦。

首先,[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]一定要让你访问 HTTPOnly cookie。但是,当用户在 上登录 Office 365 时UIWebView(void)webViewDidFinishLoad:(UIWebView *)webView委托方法会被调用多次,因此您只需要等到 FedAuth 出现在 cookie jar 中即可。

这是我的(void)webViewDidFinishLoad:(UIWebView *)webView实现;

- (void)webViewDidFinishLoad:(UIWebView *)webView {

    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *cookiesArray = [storage cookies];
    for (NSHTTPCookie *cookie in cookiesArray) {
        if ([[cookie name] isEqualToString:@"FedAuth"]) {
            /*** DO WHATEVER YOU WANT WITH THE COOKIE ***/
            break;
        }
    }
}

获取 cookie 后,只需在调用 SharePoint Web 服务时将其附加到NSURLRequestusing方法即可。(void)setAllHTTPHeaderFields:(NSDictionary *)headerFields

希望这可以帮助某人。

于 2012-09-21T12:04:30.137 回答