当前位置: 首页 > 知识库问答 >
问题:

Office365多租户OAuth 2应用程序显示无同意屏幕

华甫
2023-03-14

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

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

更详细地说,我做了以下工作。我已经创建并配置了 Azure AD 应用程序。我已将应用程序配置为多租户,并添加了 AAD 访问以及交换和共享点访问的委派权限。使用此应用程序的endpoint,我代表第三方用户发出 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好吧

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

共有1个答案

柴高岑
2023-03-14

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

https://login.windows.net/common/oauth2/authorize?response_type=code

 类似资料:
  • 当hibernate调用getConnection(String tenantIdentifier)时,我想在MYSQL数据库中设置正确的模式。我实现使用了Mysql命令来更改scheme“use sample_tenant_identifier”。我必须使用名为“用户”和“管理员”的用户。每个用户都有自己的模式。我的问题很奇怪。示例所有选择操作使用“user”模式,但插入或更新使用“admin”

  • 当使用OAuth2登录我们的应用时,常规的Google(即。gmail)帐户会出现一次同意屏幕,然后不再提示。当我使用我们基于Google Apps的Google帐户登录时,每次我都会看到同一个屏幕提示“您的域管理员已经批准访问X”。此外——同意屏幕上有我的谷歌头像的巨幅(512x512)图像。 关于为什么这些是不同的,有什么见解吗? 我正在请求以下范围 [“配置文件”、“电子邮件”、] ,并且已

  • 我们使用 EWS 托管服务已经有一段时间了,但我们希望过渡到使用 Office 365 的 RESTful API。 应用程序是否可以在未经用户同意的情况下访问我们所有的用户数据?我们有一个内部应用程序,我们希望将一些O365/Sharepoint数据提供给我们的用户。使用SSO并不是一个真正的选择,因为我们不想一直要求我们的用户给予同意(我们假设他们已经给予同意)。具体来说,我们想要访问日历和邮

  • 我必须在j2ee中开发一个多租户SaaS应用程序,从Iaas和PaaS开始实现三种云模型,我选择了openstack和openshift origin。SaaS应用程序的第一个标准是多租户,我知道有三种方法来实现它——单独的数据库——共享数据库,单独的模式——共享数据库,共享模式。我在这里迷失了方向,因为许多框架,比如ATHENA,ORM,比如hibernate,还有TOPLINK。我需要帮助了解

  • 我已经安装了keycloak-angular包,我使用它的方式如下:https://www.npmjs.com/package/keycloak-angular 问题是,在我的应用程序中,我希望有多租户。这意味着在应用程序加载期间不知道领域名。 在说明中,它说“KeycloakService应该在应用程序加载期间使用APP_INITIALIZER标记初始化”,问题是该领域是由用户给定的,在应用程序