如何为不受管理的EWS API实施Exchange在线OAuth2.0?

问题描述 投票:0回答:1

对于托管的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);
outlook office365 exchange-server exchangewebservices
1个回答
0
投票

我使用的一种方法(因为我从未尝试过如何覆盖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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.