3

我有一个用户流 B2C_1_singupsingin1 我添加了一个 api 连接器,将它嵌入到这个流和 API 调用的端点 url 中。使用的文章: https ://docs.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 不包含自定义属性。里面我看到了body.ValueKind = Undefined。告诉我我做错了什么?

而且,毕竟,我想添加一个自定义的“userId”声明,其中包含我的数据库中的一些值。使其包含在后续发行的令牌中。上面的代码对此是否正确?

4

2 回答 2

1

你的代码很好。只需在 postalCode 和 userId 前添加“ 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 似乎可以正常工作。

在此处输入图像描述

在此处输入图像描述

于 2021-11-12T20:58:49.190 回答
0

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

“JsonElement 的主体不包含自定义属性。在里面我看到 body.ValueKind = Undefined”

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

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

但我不认为 AddNewtonsoftJson 会替换用于格式化所有 JSON 内容的基于 System.Text.Json 的输入和输出格式化程序。因此,我遇到了上述问题。Microsoft 文档中的解决方案

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

于 2021-12-17T11:04:16.533 回答