【发布时间】:2016-03-13 00:17:50
【问题描述】:
我仍在为此苦苦挣扎。 详情请看我的previous question。
我正在做一个应用程序(当前是命令行),它应该通过 EWS 托管 API 访问 Office 365/Exchange。目标是通过 OAuth2 进行身份验证。
我已经在 Azure AD 中注册了一个应用程序。
我从那里使用了 ClientID
我生成了一个应用程序密钥/密钥
我已将“拥有对用户邮箱的完全访问权限(预览版)”权限委派给该应用。
我正在使用 ADAL 来检索访问令牌,如下所示:
var authority = "https://login.windows.net/<tenant>"
var authContext = new AuthenticationContext(authority);
var clientCredential = new ClientCredential("<clientId>", "<appKey>");
result = OAuthTokenManager.authContext.AcquireToken("<my ResourceID>", clientCredential);
我确实得到了一个访问令牌。解码后的值为:
{
"typ": "JWT",
"alg": "RS256",
"x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
}.
{
"aud": "<my resource ID>",
"iss": "https://sts.windows.net/2d1f889d-7930-4ef6-9f87-ef096d91ac47/",
"nbf": 1403253608,
"exp": 1403296808,
"sub": "bdb0baf9-29ca-4a43-b9f8-d81ca2ae83bd",
"appid": "<my app ID>",
"oid": "bdb0baf9-29ca-4a43-b9f8-d81ca2ae83bd",
"tid": "2d1f889d-7930-4ef6-9f87-ef096d91ac47",
"idp": "https://sts.windows.net/2d1f889d-7930-4ef6-9f87-ef096d91ac47/"
}.
[signature]
然后我使用此令牌连接到 EWS:
var service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
var credentials = new OAuthCredentials(token);
service.Credentials = credentials;
service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "<smtp address of o365 mailbox>");
Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
Folder.Bind 失败并出现 401 错误。
在 EWS Trace 中,我可以将其视为原因:
The audience claim value is invalid <my resource ID>
资源 ID 是来自已注册应用程序的“APP-ID-URI”。
我确定我只是遗漏了一个小细节......但我找不到它:)
任何指针都非常感谢。
如果我使用 https://outlook.office365.com/ 作为资源 ID (aud),我会收到以下错误消息:
ACS50001: Relying party with identifier 'https://outlook.office365.com/' was not found.
租户确实有一个 Exchange 订阅,并且它拥有邮箱的完全访问权限。
【问题讨论】:
标签: c# oauth-2.0 ms-office exchangewebservices office365