首页 > 解决方案 > 使用带有 full_access_as_user 的 Oauth 对 EWS 进行身份验证

问题描述

我正在尝试让一个使用 EWS 的应用程序通过 OAuth 对抗 O365。在我在 AAD 中注册应用程序并在门户中授予它 full_access_as_app(使用具有对所有邮箱的完全访问权限的 Exchange Web 服务)的情况下,我设法让它工作。代码如下所示:

string tokenUri = "https://login.microsoftonline.com/TENANTID/oauth2/v2.0/token";
string resource = "https://outlook.office365.com";

string appId = "APPID_FROM_AAD";
var context = new AuthenticationContext(tokenUri);
X509Certificate2 cert = GetLocalCertificate(THUMBPRINT);
ClientAssertionCertificate c = new ClientAssertionCertificate(appId, cert);
AuthenticationResult authenticationResult = context.AcquireTokenAsync(resource, c).ConfigureAwait(false).GetAwaiter().GetResult();
m_exchangeService.Credentials = new OAuthCredentials(authenticationResult.AccessToken);

//all the autodiscover URIs for O365 are the same
m_exchangeService.Url = new Uri(@"https://outlook.office365.com/EWS/Exchange.asmx");
m_exchangeService.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, m_emailAddress);

不过,这似乎有点极端。该应用程序是一个后端服务,只需要访问一个邮箱(模拟用户 ID),所以我想将其更改为 full_access_as_user 权限(通过 Exchange Web 服务以登录用户身份访问邮箱)。我给应用添加了权限,然后将应用添加到用户,但是我在冒充后尝试操作邮箱的任何时候都得到401。我检查了 JWT,虽然我在角色中有“full_access_as_app”的原始权限,但这次我没有分配任何角色。

有没有办法可以修改它,以便让管理员添加对租户中一个或多个邮箱的 EWS 访问权限,或者是让它工作以授予应用程序访问服务上每个邮箱的唯一方法?

标签: c#azureoffice365azure-active-directoryexchangewebservices

解决方案


是的,EWS 的 OAuth 身份验证仅作为 Office 365 的一部分在 Exchange 中可用。EWS 应用程序需要“完全访问用户邮箱”权限。

参考 -使用 OAuth 对 EWS 应用程序进行身份验证


推荐阅读