Как реализовать Exchange Online OAuth2.0 для неуправляемого EWS API? - PullRequest
0 голосов
/ 13 октября 2019

Для управляемого кода 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);

1 Ответ

0 голосов
/ 14 октября 2019

Один метод, который я использую (поскольку я никогда не работал над тем, как переопределить классы WSDL), заключается в том, что если вы измените файл Reference.cs, который генерируется в каталоге веб-ссылок, вы можете изменить команду GetWebResponse (В этом случаетокен передается через свойство пароля объекта credentials, но здесь можно использовать несколько различных подходов), например

        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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...