Azure API 管理获取用户身份?

Azure API Management get user identity?

这可能不受支持,但我正在考虑这样的场景。假设有一个使用 AD 身份验证的内部端点。如果要将 Azure APIM 调用路由到此后端,是否有办法让可能发起调用的最终用户访问 APIM 端点?或者这不是它的本意? APIM 是否更多地用于应用程序到应用程序类型的调用,而不一定是最终用户可能发起的调用?

提前致谢, 杰克.

根据你的要求,我做了很多测试。请参考我下面的步骤:

由于端点使用AD认证,所以用户在请求APIM(请求端点)时需要提供令牌。因此,我们可以通过解码请求 APIM 时提供的令牌来知道用户名。在此之前,您只需要知道当用户使用像 username/password flow or auth code flow, the token can include user identity. If the user use a grant flow like client credential 流这样的授权流来获取令牌时,令牌不会包含用户身份。所以在我的解决方案中,我假设用户使用 username/password 流程或授权代码流程来获取令牌。

我做了一些测试,我想在 APIM 的请求 header 中获取令牌。因此,我配置 APIM 的“诊断设置”以将日志流式传输到 Azure 存储(或事件中心)。然后在 APIM 的“日志”选项卡中查询日志。但是我发现我们在日志中看不到请求的 headers,RequestHeadersBackendRequestHeaders 字段都是空的(如下图所示)。

所以我认为我们不能通过正常的解决方案根据token获取用户身份

不过这里我提供一个解决方法供大家参考:

我用默认代码created a azure function,只加一行。

然后我在 APIM inbound 块中添加了一个策略。

<policies>
    <inbound>
        <base />
        <send-request mode="new" response-variable-name="tokenstate" timeout="20" ignore-error="true">
            <set-url>https://huryxxxxtestfun.azurewebsites.net/api/HttpTrigger6</set-url>
            <set-method>POST</set-method>
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@{
                string authHeader = context.Request.Headers.GetValueOrDefault("Authorization", "");
                string name = "unknown";
                if (authHeader?.Length > 0)
                {
                    string[] authHeaderParts = authHeader.Split(' ');
                    if (authHeaderParts?.Length == 2 && authHeaderParts[0].Equals("Bearer", StringComparison.InvariantCultureIgnoreCase))
                    {
                        Jwt jwt;
                        if (authHeaderParts[1].TryParseJwt(out jwt))
                        {
                            name = (jwt.Claims.GetValueOrDefault("name", "unknown"));
                        }
                    }
                }
                return new JObject(new JProperty("name",name)).ToString();
            }</set-body>
        </send-request>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

<send-request> 策略用于请求 azure 函数 url。我解码策略中的令牌并获取用户名,将名称发送到 azure 函数。然后我们就可以在azure function log中看到用户名了。

对了,我们也可以通过修改policy中的代码name = (jwt.Claims.GetValueOrDefault("name", "unknown"));name = (jwt.Claims.GetValueOrDefault("oid", "unknown"));来获取用户的objectid。