如何解决对于访问共享邮箱的此类 oauth 令牌,必须存在 ExchangeImpersonation SOAP 标头
随着 Exchange Web 服务的最新变化,Office 365 中的基本身份验证将停止,我将我的代码切换到 Oauth。
一切正常,除非我访问共享邮箱或统一组。 根据经验,在基本身份验证中,我不能设置 ImpersonatedUserId。
使用 Oauth:
- 如果我不设置这个标题,我会收到一个错误提示 “ExchangeImpersonation SOAP 标头必须存在于此类 oauth 令牌”。
- 如果我设置了这个标头,我会收到一条错误消息“The SMTP 地址没有与之关联的邮箱。”
邮箱存在并且我使用基本身份验证访问它。
问题如下:如何使用oauth以编程方式访问共享邮箱(或统一组邮箱)
Oauth setup : App Permission 正确设置(如果我以编程方式访问用户邮箱,它可以工作,如果我访问共享邮箱,它不会)
生成令牌的代码
_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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。