如何为非托管 EWS API 实施 Exchange 在线 OAuth2.0?

How to implement Exchange online OAuth2.0 for unmanaged EWS API?

对于托管 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;
    }