使用Oauth和full_access_as_user对EWS进行身份验证

时间:2018-08-17 17:51:24

标签: c# azure office365 azure-active-directory exchangewebservices

我正在尝试使用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 Services以登录用户身份访问邮箱)。我向该应用程序添加了权限,然后将该应用程序添加到了用户,但是在模拟后尝试在邮箱上进行操作的任何时候都得到了401。我检查了JWT,尽管获得了原始许可,但我在角色中拥有“ full_access_as_app”,但这次我没有分配任何角色。

有没有一种方法可以修改此方法,以便管理员可以向租户中的一个或多个邮箱添加EWS访问权限,或者是使此功能起作用的唯一方法,从而使应用程序可以访问服务吗?

1 个答案:

答案 0 :(得分:0)

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

参考-Authenticate an EWS application by using OAuth