Office 365 多租户 OAuth2 应用程序不显示同意屏幕

Office365 Multitenant OAuth 2 App Displays no consent screen

我正在开发一个我希望成为多租户的 Office 365 应用程序:也就是说,我希望该应用程序能够访问来自其他组织的用户的访问交换数据。到目前为止,我已经能够代表所需的第三方用户创建一个 OAuth 2 访问令牌,但是没有向用户显示任何同意屏幕并且 API 请求失败并显示 401 Unauthorized error containing the following header :

< x-ms-diagnostics: 2000001;reason="No applicable user context claims found.";error_category="invalid_token"

更详细地说,我做了以下工作。我已经创建并配置了 Azure AD 应用程序。我已将应用程序配置为多租户,并添加了 AAD 访问以及交换和共享点访问的委派权限。使用此应用程序的端点,我代表第三方用户发出 OAuth 2 授权请求。此请求成功但未显示任何同意屏幕,返回访问代码 [1]。随后的访问令牌请求也成功 [2]。访问令牌请求中请求的资源是https://outlook.office365.com,成功的访问令牌响应包含Mail.Read范围。此时,代表第三方用户 [3].

的邮件 API 请求(例如,为用户列出消息)失败

设置可供其他组织中的用户使用的适当多租户应用程序需要什么?

[1]

第三方授权码请求:

https://login.windows.net/<uid>/oauth2/authorize?api-version=1.0&client_id=<client id>&response_type=code&resource=https://outlook.office365.com/

重定向到:

http://localhost:3000/?code=<access code>&session_state=e9ba65e1-860e-41ab-b3d4-7af64d54135e

其中 localhost:3000 是我为应用程序配置的回复 URL

[2] 访问令牌请求:

curl -X POST https://login.windows.net/<uid>/oauth2/token \
  -F redirect_uri=http://localhost:3000 \
  -F grant_type=authorization_code \
  -F resource=https://outlook.office365.com \
  -F client_id=<id> \
  -F client_secret=<secret> \
  -F code=<auth code above>

回复:

200 行

{
    "access_token": "<token>",
    "expires_in": "3599",
    "expires_on": "1421092817",
    ...    "resource": "https://outlook.office365.com",
    "scope": "Calendars.Read Calendars.Write Contacts.Read Contacts.Write full_access_as_user Mail.Read Mail.Send Mail.Write",
    "token_type": "Bearer"
}

[3] API 请求:

curl -v https://outlook.office365.com/api/v1.0/me \
  -H "Authorization: Bearer <access token>"

回复:

< HTTP/1.1 401 Unauthorized
* Server Microsoft-IIS/8.0 is not blacklisted
< Server: Microsoft-IIS/8.0
< request-id: 4b30a79a-ee3d-4bac-856c-2b1cce9c4043
< Set-Cookie: ClientId=ZILVUOFNNUSPO455YJRBCW; expires=Tue, 12-Jan-2016 18:27:47 GMT; path=/; secure; HttpOnly
< x-ms-diagnostics: 2000001;reason="No applicable user context claims found.";error_category="invalid_token"
< X-Powered-By: ASP.NET
< X-FEServer: BN3PR0301CA0033
< WWW-Authenticate: Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trusted_issuers="00000001-0000-0000-c000-000000000000@*", authorization_uri="https://login.windows.net/common/oauth2/authorize", error="invalid_token",Basic Realm=""
< Date: Mon, 12 Jan 2015 18:27:49 GMT
< Content-Length: 0
<

请从您的授权请求中删除 api-version=1.0 参数。它应该看起来像这样:

https://login.windows.net/common/oauth2/authorize?response_type=code&client_id=112e0117-ef3d-44c4-a367-5b4bef313d8f&redirect_uri=https%3A%2F%2Fwww.authnauthz.com%2Foauth%2Finboundauthenticationresponse&resource=https%3A%2F%2Foutlook.office365.com&nonce=56716737-ff00-412f-a783-cddd8c109d7e&response_mode=form_post