c# - 使用带有 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 访问权限,或者是让它工作以授予应用程序访问服务上每个邮箱的唯一方法?
解决方案
是的,EWS 的 OAuth 身份验证仅作为 Office 365 的一部分在 Exchange 中可用。EWS 应用程序需要“完全访问用户邮箱”权限。
推荐阅读
- python - 如何使用 python 格式函数替换值?
- python - OSError:[WinError 10057] 无法通过套接字发送任何内容
- android - 无法在 ActionBar 中放置元素
- mysql - MySQL 总时间正在增加
- powershell - PowerShell splatting SecureString is converted to String
- tortoisegit - Push a local branch to origin using TortoiseGit
- google-translate - 使用付费谷歌翻译 api 的网页翻译器?
- python - 矩阵尺寸与 MNIST 时尚不兼容
- postgresql - PostgreSQL crosstab query with multiple columns and week day
- python-3.x - can regex can be configurable?