EWS API日历 - 冒充更新时出现错误 "访问被拒绝。检查凭证并再次尝试。"

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

我是使用EWS管理的API的新手。

以下是我在使用EWS APIs时面临的问题:EWS API - 冒充更新由服务账户以外的任何其他用户创建的日历项目时,出现错误 "访问被拒绝。检查凭证后再试。"

详情:1.我使用的是一个服务账户,例如:[email protected]。该用户是全局管理员,还分配了ApplicationImpersonation角色。(登录在线Office 365账户->管理->选择 "Exchange "选项卡->选择左侧面板上的权限->创建一个冒充角色->在角色中分配ApplicationImpersonation:和成员中的[email protected]。-> 点击保存)

  1. 由其他用户创建一个日历项目,例如:[email protected],并邀请一个与会者 - [email protected]

  2. 在一个c#程序中,我使用一个服务账号[email protected]连接到EWS服务,获取其日历事件。如果一个事件的组织者是其他用户[email protected],那么我就用下面的方式冒充来更新日历事件项的属性--主题、正文等。

    private static void Impersonate(string organizer)
    {
        string impersonatedUserSMTPAddress = organizer;
        ImpersonatedUserId impersonatedUserId =
            new ImpersonatedUserId(ConnectingIdType.SmtpAddress, impersonatedUserSMTPAddress);
    
        service.ImpersonatedUserId = impersonatedUserId;
    }
    
  3. 直到昨天下午,它还能正常工作。突然,它开始抛出一个异常 "访问被拒绝。检查凭证并再次尝试"。每当我尝试更新该事件时。

    private static void FindAndUpdate(ExchangeService service) { CalendarView cv = new CalendarView(DateTime.Now, DateTime.Now.AddDays(30)); cv.MaxItemsReturned = 25; try { FindItemsResults masterResults = service.FindItems(WellKnownFolderName.Calendar, cv);

            foreach (Appointment item in masterResults.Items)
            {
                if (item is Appointment)
                {
                    Appointment masterItem = item as Appointment;
                    if (!masterRecurEventIDs.Contains(masterItem.ICalUid.ToString()))
                    {
                        masterItem.Load();
    
                        if (!masterItem.Subject.Contains(" (Updated content)"))
                        {
                            //impersonate organizer to update and save for further use
                            Impersonate(masterItem.Organizer.Address.ToString());
    
                            // Update the subject and body
                            masterItem.Subject = masterItem.Subject + " (Updated content)";
    
                            string currentBodyType = masterItem.Body.BodyType.ToString();
                            masterItem.Body = masterItem.Body.Text + "\nUpdated Body Info: xxxxxxxxxxxx";
    
                            // This results in an UpdateItem operation call to EWS.
                            masterItem.Update(ConflictResolutionMode.AutoResolve);
    
                            // Send updated notification to organizer of an appointment
                            CreateAndSendEmail(masterItem.Organizer.Address.ToString(), masterItem.Subject);
    
                            masterRecurEventIDs.Add(masterItem.ICalUid.ToString());
                        }
                        else
                        {
                            Console.WriteLine("Event is already updated. No need to update again.:\r\n");
                            Console.WriteLine("Subject: " + masterItem.Subject);
                            Console.WriteLine("Description: " + masterItem.Body.Text);
                        }
                    }
    
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }
    
  4. 这里可能有什么问题?最初我认为可能是一个节流策略,它是停止同一用户在做一定的API调用限制的一天,但我今天仍然看到这个问题。

任何帮助是感激的。

谢谢你的帮助

calendar exchangewebservices ews-managed-api
2个回答
0
投票

找到了解决方案。

只有添加冒充的ID到现有的服务实例中是行不通的。你还需要重新验证自动发现的网址。


0
投票

我在调查一个冒充+日历的问题,发现了这个论坛的帖子。

我确信你的问题在于你试图获取然后更新日历项(约会)的方式。

你是用一个凭证(邮箱A)来获取日历项。然后在后面,在下面一行

Impersonate(masterItem.Organizer.Address.ToString());

您正在指示Ews服务对象作为被冒充的身份(邮箱B的凭据)工作。

由于您已经从邮箱A中获取了预约,现在试图使用邮箱B的凭证在邮箱A中更新该预约,如果邮箱B对邮箱A的日历没有权限,我认为这应该是行不通的。

所以在这里,其实你是想更新邮箱A的日历项,使用邮箱B的冒充凭证,由于邮箱B对邮箱A的凭证没有权限,所以出现了访问被拒绝的错误。

希望这也能帮助到别人!谢谢

© www.soinside.com 2019 - 2024. All rights reserved.