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

Microsoft图形API:为具有应用程序权限的多租户应用程序获取错误访问拒绝

侯善
2023-03-14

我正在为使用outlook的客户(多个租户)编写一个守护程序应用程序。

我正在使用 2 个需要管理员同意的应用程序权限 - Mail.ReadBasic.All User.Read.All。我的应用首先需要读取所有用户的 ID,然后获取其电子邮件的所有元数据。

我用office365创建了一个新的租户来测试它,我们称之为- test,并在两个用户之间发送了几封电子邮件。< br >因此,首先,我将测试组织的管理员重定向到adminconsentendpoint,在那里他/她向我的应用程序授予应用程序权限。这是我正在使用的URL:

https://login.microsoftonline.com/organizations/v2.0/adminconsent?
client_id=<the app ID>
&state=<some state>
&redirect_uri=<my redirect URL as written in the app configuration>
&scope=https://graph.microsoft.com/.default

调用此endpoint后,我可以看到我的应用程序在Enterprise应用程序下的测试组织中列出,并且可以看到管理员授予的相关权限。

因为我没有从这个流中获得代码(oAuth2身份验证流需要),所以我需要请求管理员再次登录。我使用这个网址是为了:

https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?
client_id=<same app ID>
&response_type=code
&redirect_uri=<same redirect URL>
&scope=https://graph.microsoft.com/.default+offline_access+openid+profile
&state=<some state>

登录成功后,我会将代码返回到我的重定向URL,在另一个请求后,我将获得访问令牌。使用此访问令牌,我尝试访问以下任何API:

  • https://graph.microsoft.com/v1.0/users
  • https://graph.microsoft.com/v1.0/users/user-id-of-user-in-test-org/messages

但是我收到错误访问被拒绝,并显示一条消息:访问被拒绝。请检查凭据,然后重试。

进一步的信息:我正在使用python和MSAL包来构建应用程序(使用class-< code > confidential client application )和用于身份验证流的URL(但不是用于adminconsentendpoint,因为我找不到如何做)

你知道我做错了什么吗?我对此失去了理智... :(

共有1个答案

沈宇定
2023-03-14

这一页应该描述你需要的一切:https://learn.microsoft.com/graph/auth-v2-service

管理员同意URL应特定于客户的租户。如果您想允许登录任何租户,您可以使用通用一词。

<代码>https://login.microsoftonline.com/{租户}/adminconsense

您还必须对redirect_uri参数(以及所有其他参数)进行 URL 编码。出于某种原因,该文档中的示例未进行 URL 编码,但此处的值必须进行 URL 编码。您应该看不到此参数的冒号、斜杠、与号等。

有关请求特定范围以获得管理员同意的另一个示例(而不是您在AAD客户端应用程序注册期间列出的所有默认范围),请参见https://learn.microsoft.com/azure/active-directory/develop/v2-admin-consent.

>

  • 您将收到对重定向 URI 的回调,以指示一切正常。这包括授予管理员同意的租户 ID。

    之后,您为租户ID、应用程序客户机ID和特定的请求范围发起一个单独的令牌请求调用。这将返回一个适当的访问令牌,您可以在所有API调用中直接使用它。可以这样做:https://learn . Microsoft . com/azure/active-directory/develop/scenario-daemon-acquire-token?tabs = python # acquire tokenforclient-API

    # The pattern to acquire a token looks like this.
    result = None
    
    # First, the code looks up a token from the cache.
    # Because we're looking for a token for the current app, not for a user,
    # use None for the account parameter.
    result = app.acquire_token_silent(config["scope"], account=None)
    
    if not result:
        logging.info("No suitable token exists in cache. Let's get a new one from AAD.")
        result = app.acquire_token_for_client(scopes=config["scope"])
    
    if "access_token" in result:
        # Call a protected API with the access token below.
        print(result["token_type"])
    else:
        print(result.get("error"))
        print(result.get("error_description"))
        print(result.get("correlation_id"))  # You might need this when reporting a bug.
    

    希望有帮助。上面的文章有所有的细节。

  •  类似资料:
    • 我正在尝试access Microsoft Graph API使用以下endpoint查询用户所属的组列表 https://graph.microsoft.com/v1.0/users/{userID}/memberof 但从过去两天开始,我的查询失败了,回复如下 谢谢你的帮助。

    • Microsoft Graph API提供了仅适用于应用程序的身份验证方案,该方案非常适合拥有应用程序的租户。 我有一个Azure租户,我按照文档指南在其中创建了应用程序。我的应用程序现在可以使用endpoint获得访问令牌,这允许我查询租户内用户的图形API。 但是,我希望我的应用程序能够为其他租户获得访问令牌。我认为外部租户所有者应该以某种方式将我的应用程序插入到他们的Azure租户中,应用某

    • 我正在使用outlook Mail REST API(https://docs.microsoft.com/en-us/previous-versions/office/office-365-api/API/version-2.0/mail-rest-operations)编写一个守护程序应用程序来管理我的个人microsoft outlook帐户。为此,我必须生成适当的授权令牌,以便与API调用

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