EWS - 如何传递自动发现的凭证 - ios,cocoa

时间:2013-09-12 14:26:26

标签: ios objective-c macos cocoa

经过大量搜索后,我发布了这个问题。

这是问题..

我正在使用EWS使用自动发现来联系MAc应用程序。

这是我的XML请求

      NSString *soapMessage = [NSString stringWithFormat:
                         @"<Autodiscover xmlns=\"http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006/\">"
                         "<Request>"
                         "<EMailAddress>%@</EMailAddress>"
                         "<AcceptableResponseSchema>"
                         "http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a"
                         "</AcceptableResponseSchema>"
                         "</Request>"
                         "</Autodiscover>",self.emailId.stringValue];
NSLog(@"%@",soapMessage);

NSURL *url = [NSURL URLWithString:@"https://<domainname>/EWS/Exchange.asmx"];

以上只是片段。已完整传递其他标头。

我的问题在于传递用户凭证的确切位置,因为它们传递了C#,如下所示

 ExchangeServiceBinding esb = new ExchangeServiceBinding();
 esb.Credentials = new NetworkCredential("<username>", "<password>", "<domain>");

我尝试使用质询验证,并尝试使用标头授权发送它。但没有运气。

非常感谢任何帮助实现这一目标。

2 个答案:

答案 0 :(得分:4)

所有关于为EWS构建正确的XML请求。就是这样......

使用https://www.testexchangeconnectivity.com/获取邮件,联系人,日历以进行测试。

检查它生成的请求,将其复制到XML的标题部分。

它像微风一样......

发布此内容以节省一些非窗口开发人员的时间。

答案 1 :(得分:0)

实际上,质询验证适用于Exchange Web服务。 EWS使用ServerTrust和NTLM身份验证。 以这种方式实现NSURLConnectionDelegate方法:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ( challenge.previousFailureCount > 0 )
    {
        // handle authentication error here, e.g. NSError *authError = ...;
        return;
    }

    // username and password should be stored as ivars.
    NSString *username = @"your_username";
    NSString *password = @"your_password";

    NSURLCredential *urlCredential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession];

    [challenge.sender useCredential:urlCredential forAuthenticationChallenge:challenge];
}


- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
    // Should return YES for NTLM and ServerTrust methods.
    NSString *authMethod = protectionSpace.authenticationMethod;
    return ([authMethod isEqualToString:NSURLAuthenticationMethodServerTrust] ||
            [authMethod isEqualToString:NSURLAuthenticationMethodNTLM] );
}