如何使用 api 连接器和 asp net core web api 通过自定义声明来丰富 azure b2c 令牌

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

我有一个用户流程B2C_1_singupsingin1 我添加了一个 api 连接器,将其嵌入到该流和 API 调用的端点 url 中。 使用过的文章: https://learn.microsoft.com/en-us/azure/active-directory-b2c/add-api-connector-token-enrichment?pivots=b2c-user-flow

从文章中可以清楚地看出,API 连接器具体化为 HTTP POST 请求,发送自定义属性。

我的 Web api 有一个带有代码的端点:

[HttpPost("enrich")]
public IActionResult Enrich([FromBody] JsonElement body)
{
    var responseProperties = new Dictionary<string, object> //for example
    {
        { "version", "1.0.0" },
        { "action", "Continue" },
        { "postalCode", "12349" },
        { "userId", 123 } 
    };

    return new JsonResult(responseProperties) { StatusCode = 200 };
}

当我启动自定义流程时,一切正常,我可以到达 api 中的该端点。 但存在一个问题,JsonElement 主体不包含自定义属性。在里面我看到

body.ValueKind = Undefined
。 告诉我我做错了什么?

此外,毕竟我想添加一个自定义的“userId”声明,其中包含数据库中的一些值。 以便将其包含在后续发行的token中。上面的代码是否正确?

c# azure azure-ad-b2c azure-ad-b2c-custom-policy aad-b2c
3个回答
5
投票

你的代码没问题。只需在邮政编码和用户 ID 前面添加“extension_”即可。

    [HttpPost("log")]
    public IActionResult Log([FromBody] JsonElement body)
    {

        var responseProperties = new Dictionary<string, object> 
        {
            { "version", "1.0.0" },
            { "action", "Continue" },
            { "extension_Role", "admin" },
        };

        return new JsonResult(responseProperties) { StatusCode = 200 };
    }

在我的 Azure AD B2C 中,我有一个名为“角色”的自定义属性。

但在调试模式下,我看到对于所有自定义属性extension_都设置为前缀...

因此,通过将其添加到responseProperties,它似乎可以正常工作。


0
投票

我很久以前就解决了这个问题,但也许我的经验会对某人有所帮助。 问题的第一部分:

“JsonElement 的主体不包含自定义属性。在 I 内部 请参阅 body.ValueKind = 未定义”

出了什么问题。 为了支持 HTTP Patch 请求,我将 NewtonsoftJson 包和配置添加到 Startup:

services.AddControllers().AddNewtonsoftJson(x => 
{
   x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

但我没有考虑到 AddNewtonsoftJson 会取代用于格式化所有 JSON 内容的基于 System.Text.Json 的输入和输出格式化程序。因此我遇到了上述问题。 微软文档的解决方案

问题第二部分的解决方案以及自定义声明由Steffen提供。您只需在声明中添加 extension_ 前缀即可。


0
投票

我想指导这方面的工作代码参考,以便万一有人需要它会帮助他们。

截至 2024 年 1 月,Azure AD B2C 中使用的 API 连接器是稳定的(尽管它显示为预览版),我们可以丰富外部声明。

以下是如何执行此操作的概述。

  1. 在 Azure AD B2C 的自定义属性中,根据需要创建属性。
  2. 在用户流程中,例如SUSI(注册登录用户流程),在应用程序声明中选择这些创建的属性
  3. 创建可以通过 API 连接器调用的 Azure 函数或任何 http 函数(应该是响应速度更快的函数)。
  4. 配置 API 连接器以通过基本身份验证调用此函数
  5. 在 SUSI 用户流程中连接它

现在,在生成令牌之前添加声明。闲置 GitHub 存储库中的详细代码

https://github.com/learnsmartcoding/e-commerce-smartcarthub-azure-functions

参考视频链接:https://youtu.be/KKkgKMMyZFw

例如 SignUpValidation 函数由 Azure AD B2C 通过 API 连接器调用。在生成令牌并将其颁发给调用者之前调用此调用。该函数接收请求,与其他函数对话以在数据库中创建用户及其角色,然后返回声明中的 UserId 和用户角色。

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