对于托管的EWS代码,我已经习惯了OAuth 2.0来获取令牌,并且该令牌有效。对于非托管EWS,由于未授权错误,它无法连接到Exchange。
下面是访问非托管EWS的代码。如何使以下代码与OAuth令牌一起使用,而不是按以下方式传递凭据?
Binding = new ExchangeServiceBinding
{
Url = ServerUrl,
Credentials = new OAuthCredentials(token),
RequestServerVersionValue = new RequestServerVersion { Version = ExchangeVersionType.Exchange2007_SP1 },
ExchangeImpersonation = null
};
上面没有工作,因为凭据正在询问ICredentials类型,并且它不接受令牌。请帮我。下面是我直接访问托管EWS的代码。
var authResult = await pca.AcquireTokenByUsernamePassword(ewsScopes, credential.UserName, credential.SecurePassword).ExecuteAsync();
configure the ExchangeService with the access token
ExchangeService = new ExchangeService();
ExchangeService.Url = new Uri(ServerUrl);
ExchangeService.Credentials = new OAuthCredentials(authResult.AccessToken);
我使用的一种方法(因为我从未尝试过如何覆盖WSDL类)是,如果您修改在Web参考目录中生成的Reference.cs文件,则可以修改GetWebResponse命令(在这种情况下,令牌是是通过凭据对象密码属性传递的,但是您可以在此处采取多种不同的方法),例如]
private String AnchorMailbox;
private bool oAuth;
protected override System.Net.WebResponse GetWebResponse(System.Net.WebRequest req)
{
if (xAnchorMailbox != null)
{
if (xAnchorMailbox != "")
{
req.Headers.Add("X-AnchorMailbox", AnchorMailbox);
}
}
if(req.Credentials is System.Net.NetworkCredential)
{
if(oAuth){
req.Headers.Add("Authorization", ("Bearer " + ((System.Net.NetworkCredential)req.Credentials).Password));
}
}
System.Net.HttpWebResponse
rep = (System.Net.HttpWebResponse)base.GetWebResponse(req);
return rep;
}