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

时间:2015-01-12 22:31:47

标签: azure ms-office office365

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

< 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范围。此时,邮件API请求(例如,为用户列出消息)代表第三方用户失败[3]。

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

[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 OK

{
    "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
<