我可以从Azure AD获取我的应用程序的id_token吗?

问题描述 投票:0回答:2

使用Azure AD中的client_credentials流,我无法为我的应用程序检索id_token。

我正在尝试使用Azure AD OAuth / OpenID端点,并遇到一些问题。

我通过Graph API创建了一个带有最小配置的简单应用程序(测试终端,但仍然如此)。我删除了所有标题,并在下面的代码段中匿名:

curl -X POST \
  https://graph.microsoft.com/beta/applications \
  -d '{
    "displayName": "App Name",
    "passwordCredentials": [
        {
            "endDateTime": "2299-12-30T23:00:00Z",
            "startDateTime": "2019-02-14T20:19:14.686691Z",
            "secretText": "<SOME KEY>",
            "displayName": "Client Secret"
        }
    ]
}'

在Azure AD的响应中,我得到了一个appId:

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#applications/$entity",
    "id": "<SOME GUID>",
    "deletedDateTime": null,
    "isFallbackPublicClient": null,
    "appId": "<SOME GUID>",
    ...

这足以让我能够从v1 OAuth端点检索access_token:

curl -X POST \
  https://login.microsoftonline.com/tenant_id/oauth2/token \
  -d 'client_id=appId&client_secret=secretText&grant_type=client_credentials'

响应:

{
    "token_type": "Bearer",
    "expires_in": "3600",
    "ext_expires_in": "3600",
    "expires_on": "1550220412",
    "not_before": "1550216512",
    "resource": "00000002-0000-0000-c000-000000000000",
    "access_token": "<JWT access token>"
}

由于我没有在调用中指定资源,因此我获得了默认的Graph API资源。

现在,我还想得到的是我的应用程序的id_token。我已经能够从其他OpenID提供商那里获得这些令牌。但是,OpenID Connect Core规范。让我有理由认为id_tokens仅适用于最终用户,而不是应用:

“ID令牌是一个安全令牌,其中包含有关授权服务器在使用客户端时对最终用户进行身份验证的声明,以及可能还有其他请求的声明”

(来自https://openid.net/specs/openid-connect-core-1_0.html#IDToken

resource=openid添加到上面的令牌端点的POST将不起作用,因为openid是范围,而不是资源。

切换到v2端点,我可以访问scope参数。我可以通过设置scope=https://graph.microsoft.com/.default从那里获取访​​问令牌,显式请求我通过v1端点默认获得的访问权限。

但是,将范围设置为例如scope=https://graph.microsoft.com/.default openid并不会为我的应用程序提供id_token,并且访问令牌看起来与之前的调用相同。

尝试只是scope=openid从Azure AD给我以下错误:

AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope openid is not valid.

所有这些结合使我相信我已经使用并通过client_credentials流程发布了id_tokens的OpenID提供程序违反了规范,并且只能为最终用户获取id_tokens(使用authorization_code流程从Azure AD获取id_token)我自己没有任何问题)。

这是正确的结论,还是我可以强制Azure AD向应用程序和最终用户发出id_tokens?

azure-active-directory microsoft-graph openid
2个回答
2
投票

用户登录时会发出id_token。客户端凭据流没有用户,因此不会发出id_token。

你需要使用像authorization code grantopenID connect这样的流来签署用户。响应将有一个id_token。


0
投票

您不能使用客户端凭据流来获取仅限app的id_token,它只返回access_token。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.