gpt4 book ai didi

azure - 我可以使用 Azure B2C 来获取 id token *和*获取 Azure 部署服务的访问 token 吗?

转载 作者:行者123 更新时间:2023-12-02 05:34:11 26 4
gpt4 key购买 nike

我只能弄清楚如何使用 B2C 获取 id token - 但随后我失去了常规 AAD 应用程序的所有好处(特别是访问 token 、范围和用户同意)
下面我将描述一个简化的场景,以及我的尝试。
设想
想象一下,我正在开发一个客户端(javascript SPA)和两个服务(WebAPI):
enter image description here

  • 一个 是一个基于 WebAPI 的服务,具有两个范围(ReadA 和 WriteA),在 Azure 中注册和托管
  • 是另一个基于 WebAPI 的服务,具有两个范围(ReadB 和 WriteB),在 Azure 中注册和托管
  • C 是 Javascript SPA

  • 现在,我希望用户使用 Azure B2C 登录,从而为我的客户端 C 生成以下 token :
  • 一个 id token ,因此客户端 C 可以按名称寻址我
  • 服务 A 的访问 token ,范围为 ReadA 和 WriteA(在通常的用户同意后发布)
  • 服务 B 的访问 token ,范围为 ReadB(在通常的用户同意后发布)

  • 这能做到吗?如何?有什么例子吗?
    我能找到的所有示例都显示了一个客户端对用户进行身份验证,还有一些示例显示了如何获取单个访问 token (不支持范围)
    到目前为止我尝试过的
    到目前为止,我的实验是使用
  • 我自己的 B2C 租户使用配方注册 Azure Active Directory B2C: Create an Azure AD B2C tenant (为了最初的简单起见,只有本地帐户) - 我们称之为 fooplanner.onmicrosoft.com
  • 使用配方 Create an API app in Azure and deploy code to it 在该租户中注册和部署的服务 A (定义了 ReadA 和 WriteA 范围)- 应用程序 ID AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA
  • 使用配方 Create an API app in Azure and deploy code to it 在该租户中注册和部署服务 B (定义了范围 ReadB)- 具有应用程序 ID BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB
  • 在 B2C 注册的应用程序 FooPlanner - ID FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
  • 客户端 C 使用 oidc-client.js - 我会使用 adal.js,但它不支持 B2C(此外,它显然被 MSA 取代,它甚至还不支持 Javascript...)

  • 为避免与客户端库相关的混淆,我将根据 Fiddler 报告的发送和接收的请求和响应来描述下面的实验。
    单个客户端 - 仅限 ID token
    这是基准场景,我发现的大多数操作方法都显示了这一点。
    客户端 C 向 B2C 发送以下请求:
    https://login.microsoftonline.com/fooplanner.onmicrosoft.com/oauth2/v2.0/authorize?
    p=b2c_1_fooplanner-signuporsignin&
    client_id=ffffffff-ffff-ffff-ffff-ffffffffffff&
    response_type=id_token&
    scope=openid email profile
    在提示我输入凭据后,B2C 最终返回一个 id_token (其中 uuu... 是我在 B2C 中的用户条目的 GUID):
    id-token:
    {
    "ver": "1.0",
    "iss": "https://login.microsoftonline.com/08de3e5f-6a10-4d7c-a0e3-fc4a627a712b/v2.0/",
    "sub": "uuuuuuuu-uuuu-uuuu-uuuu-uuuuuuuuuuuu",
    "aud": "ffffffff-ffff-ffff-ffff-ffffffffffff",
    "oid": "uuuuuuuu-uuuu-uuuu-uuuu-uuuuuuuuuuuu",
    "name": "Thomas"
    "tfp": "B2C_1_fooplanner-signuporsignin"
    }
    (为简洁起见,我省略了所有 OAuth2 重定向、Base64 JWT 解码等。我什至从 token 中省略了时间戳、随机数等。如果它们相关,我可以提供完整的详细信息)
    这由 oidc-client.js 按预期接收和处理:我最终得到一个 ID token ,但没有访问 token 。
    单个客户端 - ID token + 访问 token
    经过一番挖掘,我也找到了一种获取访问 token 的方法:在范围中包含 B2C 应用程序 ID,并同时请求 tokenid_token响应类型。
    在此变体中,客户端 C 向 B2C 发送以下请求:
    https://login.microsoftonline.com/fooplanner.onmicrosoft.com/oauth2/v2.0/authorize?
    p=b2c_1_fooplanner-signuporsignin&
    client_id=ffffffff-ffff-ffff-ffff-ffffffffffff&
    response_type=token id_token&
    scope=openid email profile ffffffff-ffff-ffff-ffff-ffffffffffff
    B2C 最终返回一个 id_token和一个 access_token :
    id_token:
    {
    "ver": "1.0",
    "iss": "https://login.microsoftonline.com/08de3e5f-6a10-4d7c-a0e3-fc4a627a712b/v2.0/",
    "sub": "uuuuuuuu-uuuu-uuuu-uuuu-uuuuuuuuuuuu",
    "aud": "ffffffff-ffff-ffff-ffff-ffffffffffff",
    "oid": "uuuuuuuu-uuuu-uuuu-uuuu-uuuuuuuuuuuu",
    "name": "Thomas"
    "tfp": "B2C_1_fooplanner-signuporsignin"
    }

    access_token:
    {
    "iss": "https://login.microsoftonline.com/08de3e5f-6a10-4d7c-a0e3-fc4a627a712b/v2.0/",
    "aud": "ffffffff-ffff-ffff-ffff-ffffffffffff",
    "oid": "uuuuuuuu-uuuu-uuuu-uuuu-uuuuuuuuuuuu",
    "sub": "uuuuuuuu-uuuu-uuuu-uuuu-uuuuuuuuuuuu",
    "name": "Thomas",
    "tfp": "B2C_1_fooplanner-signuporsignin",
    }
    oidc-client.js 再次按预期接收和处理:我最终得到一个 ID token 和一个访问 token 。
    但是请注意这两个 token 的熟悉程度如何 - 但话说回来,我要求的是 B2C 应用程序的访问 token ,而不是正确注册的 (AAD) 应用程序。
    单一客户,单一服务
    所以我想:让我们按照以前的方法 - 只是这一次,为两个真正的服务之一请求访问 token 。
    要求:
    https://login.microsoftonline.com/fooplanner.onmicrosoft.com/oauth2/v2.0/authorize?
    p=b2c_1_fooplanner-signuporsignin&
    client_id=ffffffff-ffff-ffff-ffff-ffffffffffff&
    response_type=token id_token&
    scope=openid email profile aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
    然而,这提示未知范围( aaa... ) - 所以要么我滥用协议(protocol),要么 B2C 不知道常规 AAD 应用程序(在同一个租户中,请注意)。
    推测:使用授权端点?
    我在某处(OpenID 规范?)读到过,IdP(即 B2C)有一个授权端点,您可以用它来交换 id_token对于 access_token .
    这是解决这个问题的方法吗?是否有任何客户端库支持这一点?

    最佳答案

    Azure AD B2C 启动了对访问 token 和自定义范围的支持:https://azure.microsoft.com/en-us/blog/azure-ad-b2c-access-tokens-now-in-public-preview/
    https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-access-tokens

    但是,仍然存在一个限制,即您一次只能为一个应用程序请求访问 token ,因此这将是两个请求。 (但由于用户通过 B2C 进行了身份验证,第二个请求将包含一个 cookie,B2C 将默默地重定向回依赖方应用程序)

    https://login.microsoftonline.com/fooplanner.onmicrosoft.com/oauth2/v2.0/authorize?
    p=b2c_1_fooplanner-signuporsignin&
    client_id=ffffffff-ffff-ffff-ffff-ffffffffffff&
    response_type=id_token token&
    scope=openid https://fooplanner.onmicrosoft.com/webapi1/readscopeA https://fooplanner.onmicrosoft.com/webapi1/writescopeA profile

    https://login.microsoftonline.com/fooplanner.onmicrosoft.com/oauth2/v2.0/authorize?
    p=b2c_1_fooplanner-signuporsignin&
    client_id=ffffffff-ffff-ffff-ffff-ffffffffffff&
    response_type=id_token token&
    scope=openid https://fooplanner.onmicrosoft.com/webapi2/readscopeB https://fooplanner.onmicrosoft.com/webapi2/writescopeB profile

    如果授权请求中的 response_type 参数包含“token”,则“scope”参数必须包含至少一个将被授予的资源权限(“openid”和“offline_access”除外)。否则,授权请求将因失败而终止。

    关于azure - 我可以使用 Azure B2C 来获取 id token *和*获取 Azure 部署服务的访问 token 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41542621/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com