【问题标题】:ExchangeImpersonation SOAP header must be present for this type of oauth token accessing shared mailbox访问共享邮箱的此类 oauth 令牌必须存在 ExchangeImpersonation SOAP 标头
【发布时间】:2022-01-24 15:50:26
【问题描述】:

随着 Exchange Web 服务最近发生变化,Office 365 中将停止基本身份验证,我将代码切换到 Oauth。

除了访问共享邮箱或统一组外,一切正常。 根据经验,在基本身份验证中,我不能设置 ImpersonatedUserId。

使用 Oauth:

  • 如果我不设置此标头,我会收到一条错误消息 "ExchangeImpersonation SOAP 标头必须存在于这种类型的 oauth 令牌”。
  • 如果我设置此标头,我会收到一条错误消息,提示“The SMTP 地址没有与之关联的邮箱。"

邮箱存在并且我使用基本身份验证访问它。

问题如下:如何使用 oauth 以编程方式访问共享邮箱(或统一组邮箱)

Oauth 设置:应用权限设置正确(如果我以编程方式访问用户邮箱,它可以工作,如果我访问共享邮箱,它不会)

生成令牌的代码

_service = new ExchangeService(ExchangeVersion.Exchange2013);
_service.TraceFlags = TraceFlags.None;
_service.PreAuthenticate = true;
_service.Timeout = 600000; // 10 minutes
string token = GetTokenForUserAsync().Result;
_service.Credentials = new OAuthCredentials(token);   
_service.UseDefaultCredentials = false;
string url = "https://outlook.office365.com/ews/Exchange.asmx";
_service.Url = new Uri(url);
_service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "sharedmailbox@domain.com");

_fdInbox = Microsoft.Exchange.WebServices.Data.Folder.Bind(_service, new FolderId(WellKnownFolderName.Inbox, "sharedmailbox@domain.com"));


private async System.Threading.Tasks.Task<string> GetTokenForUserAsync()
    {
        string domainName = _context.MigrationDefinition.TargetConfiguration.DomainName;
        string clientId = _context.MigrationDefinition.TargetConfiguration.ClientID;
        string clientSecret = _context.MigrationDefinition.TargetConfiguration.ClientSecret;
        string microsoftLoginUrl = AzureURL.GetLoginUrl(_context.MigrationDefinition.TargetConfiguration.ServerRegion);
        string loginUrl = string.Format("{0}/{1}", microsoftLoginUrl, domainName);
        loginUrl = "https://login.microsoftonline.com/" + domainName + "/oauth2/v2.0/token";
        string redirectUri = "https://myapp.azurewebsites.net";
        IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithAuthority(loginUrl)
            .WithRedirectUri(redirectUri)
            .Build();

        var ewsScopes = new string[] { "https://outlook.office365.com/.default" };
       
        Microsoft.Identity.Client.AuthenticationResult result = await app.AcquireTokenForClient(ewsScopes).ExecuteAsync();
        return result.AccessToken;
    }

【问题讨论】:

    标签: oauth exchangewebservices


    【解决方案1】:

    解决方案是使用委托,而不是模拟共享邮箱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 2015-10-08
      相关资源
      最近更新 更多