EWS API, 401 Неавторизованный доступ к BindToItems

Я борюсь с простой задачей, которая получает новые электронные письма в определенных папках в Exchange Online, устанавливает обработанную категорию, а затем сохраняет электронную почту.

Во-первых, я создаю разрешения для приложений следующим образом:

 var app = ConfidentialClientApplicationBuilder.Create(_appConfig.ClientId)
                                                          .WithAuthority(AzureCloudInstance.AzurePublic,
                                                                         _appConfig.Tenant)
                                                          .WithClientSecret(_appConfig.ClientSecret)
                                                          .Build();
            AuthenticationResult authResultresult = null;
            var ewsScopes = new[] {"https://outlook.office.com/.default"};

        
            authResultresult = await app.AcquireTokenForClient(ewsScopes)
                                                     .ExecuteAsync();      

затем я создаю Exchange-Client и использую созданный Oauth-Token для авторизации:

var result = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
        result.KeepAlive = false;
        result.DateTimePrecision = DateTimePrecision.Milliseconds;
        result.Url =  new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
        result.UseDefaultCredentials = false;         

        var authResultresult = await CreateAppPermissions(_appConfig);
        result.Credentials = new OAuthCredentials(authResultresult.AccessToken);            

после этого я выдаю себя за SMTP-User с моей учетной записью mainSMTP

result.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, _appConfig.SMTPMailAccount);

после этого я использую этот код для получения электронной почты с использованием известного идентификатора, добавляю для нее новую категорию и обновляю элемент следующим образом:

   var itemsToStore = result.BindToItems(new []{newItemId}, props);
                foreach (var itemToStore in itemsToStore)
                {                   
                    itemToStore.Item.Categories.Add("Processed");
                
                    itemToStore.Item.Update(ConflictResolutionMode.AlwaysOverwrite, true); 
                } 

Этот код ранее выдавал сообщение «Отказано в доступе. Проверьте учетные данные и повторите попытку. Не удается сохранить изменения, внесенные в элемент. - Исключение для Item.Update. После исследования я нашел это:

Office 365 API ErrorAccessDenied (доступ запрещен . Проверьте учетные данные и повторите попытку.)

и последовал предложенному решению, сняв флажок Иметь полный доступ к почтовому ящику пользователя.

После этого я получаю 401 несанкционированный доступ, когда звоню BindToItems. Было ли это шагом назад, чтобы убрать флажок?


person Teodor Głaz    schedule 10.08.2020    source источник


Ответы (1)


РЕШЕНО: найдено решение для 401:

поскольку я использую EWS, также известный как более старый API, называемый веб-службами Exchange, снять флажок было ошибкой.

причина «Отказано в доступе. Проверьте учетные данные и повторите попытку. Не удается сохранить изменения, внесенные в элемент. было то, что олицетворяемый пользователь не имел права изменять чужие адреса электронной почты

person Teodor Głaz    schedule 10.08.2020