通过 JWT 令牌在 Azure API 管理中进行授权

2023-12-04

我编写了一个入站策略,该策略启用 CORS 并根据授权服务器验证访问令牌。以下政策运行良好:

<policies>
    <inbound>
        <!-- Extract Token from Authorization header parameter -->
        <set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization","scheme param").Split(' ').Last())" />
        <!-- Send request to Token Server to validate token (see RFC 7662) -->
        <send-request mode="new" response-variable-name="tokenstate" timeout="20" ignore-error="true">
            <set-url>https://sso-dev.shell.com/as/introspect.oauth2</set-url>
            <set-method>POST</set-method>
            <set-header name="Content-Type" exists-action="override">
                <value>application/x-www-form-urlencoded</value>
            </set-header>
            <set-body>@($"grant_type=urn:pingidentity.com:oauth2:grant_type:validate_bearer&client_id=UnitsOfMeasure&client_secret=somesecret&token={(string)context.Variables["token"]}")</set-body>
        </send-request>
        <cors>
            <allowed-origins>
                <origin>*</origin>
            </allowed-origins>
            <allowed-methods>
                <method>*</method>
            </allowed-methods>
            <allowed-headers>
                <header>*</header>
            </allowed-headers>
            <expose-headers>
                <header>*</header>
            </expose-headers>
        </cors>
        <choose>
            <when condition="@((bool)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["active"] == false)">
                <!-- Return 401 Unauthorized with http-problem payload -->
                <return-response response-variable-name="existing response variable">
                    <set-status code="401" reason="Unauthorized" />
                    <set-header name="WWW-Authenticate" exists-action="override">
                        <value>Bearer error="invalid_token"</value>
                    </set-header>
                </return-response>
            </when>
        </choose>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <set-header name="Access-Control-Allow-Origin" exists-action="override">
            <value>*</value>
        </set-header>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

现在我添加一个条件,仅当用户属于某个组时才授权他们使用 PUT、POST 或 DELETE 方法:

    <when condition="@(new [] {"post=""", "put=""", "delete="""}.Contains(context.Request.Method,StringComparer.OrdinalIgnoreCase))">
        <validate-jwt header-name="Authorization">
            <required-claims>
                <claim name="groups">
                    <value>UOM WriteAdmin</value>
                </claim>
            </required-claims>
        </validate-jwt>
    </when>

但我在保存策略时遇到以下错误:

One or more fields contain incorrect values:
Error in element 'choose' on line 28, column 10: Syntax error, ',' expected

我不确定出了什么问题。这是合并授权逻辑后的最终策略:

<policies>
    <inbound>
        <!-- Extract Token from Authorization header parameter -->
        <set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization","scheme param").Split(' ').Last())" />
        <!-- Send request to Token Server to validate token (see RFC 7662) -->
        <send-request mode="new" response-variable-name="tokenstate" timeout="20" ignore-error="true">
            <set-url>https://sso-dev.shell.com/as/introspect.oauth2</set-url>
            <set-method>POST</set-method>
            <set-header name="Content-Type" exists-action="override">
                <value>application/x-www-form-urlencoded</value>
            </set-header>
            <set-body>@($"grant_type=urn:pingidentity.com:oauth2:grant_type:validate_bearer&client_id=UnitsOfMeasure&client_secret=somesecret&token={(string)context.Variables["token"]}")</set-body>
        </send-request>
        <cors>
            <allowed-origins>
                <origin>*</origin>
            </allowed-origins>
            <allowed-methods>
                <method>*</method>
            </allowed-methods>
            <allowed-headers>
                <header>*</header>
            </allowed-headers>
            <expose-headers>
                <header>*</header>
            </expose-headers>
        </cors>
        <choose>
            <when condition="@((bool)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["active"] == false)">
                <!-- Return 401 Unauthorized with http-problem payload -->
                <return-response response-variable-name="existing response variable">
                    <set-status code="401" reason="Unauthorized" />
                    <set-header name="WWW-Authenticate" exists-action="override">
                        <value>Bearer error="invalid_token"</value>
                    </set-header>
                </return-response>
            </when>
            <when condition="@(new [] {"post=""", "put=""", "delete="""}.Contains(context.Request.Method,StringComparer.OrdinalIgnoreCase))">
                <validate-jwt header-name="Authorization">
                    <required-claims>
                        <claim name="groups">
                            <value>UOM WriteAdmin</value>
                        </claim>
                    </required-claims>
                </validate-jwt>
            </when>            
        </choose>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <set-header name="Access-Control-Allow-Origin" exists-action="override">
            <value>*</value>
        </set-header>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

尝试这个:

<when condition="@(new [] {"post", "put", "delete"}.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))">

你那里似乎有一些额外的符号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 JWT 令牌在 Azure API 管理中进行授权 的相关文章

随机推荐

  • Javascript 回调的范围问题

    我在使回调函数正常工作时遇到一些问题 这是我的代码 SomeObject prototype refreshData function var read obj new SomeAjaxCall read some data this re
  • 现有 WOPI 主机?

    我即将实现自己的 WOPI 主机 用于在 iOS 和 Android 上查看和编辑 Office 文档 但我想知道是否已经有任何现有的解决方案 例如 我可以使用 SharePoint 或 OneDrive 文档吗 这是我现有的实现的小列表
  • 具有泛型属性的 LINQ 表达式

    我的问题与此相关 具有通用类属性的 linq 表达式 这次我想获得具有共同 id 的新创建的对象 id 实际上是外键 因此可以有不同的名称 我想出了以下几点 public static IEnumerable
  • 解码的 json 响应返回空结构[重复]

    这个问题在这里已经有答案了 我正在尝试获取 trello 组织成员列表 当我打印结果时 我有正确的结构数量 17 个结构 17 个成员 但结构是空的 这是我的代码 package main import fmt import net htt
  • “cp -t”发生了什么?

    我正在阅读一些使用通配符运算符从目录复制文件但排除一个文件的方法 我看到了cp t与 一起使用时发挥作用find 然而 每当我尝试跑步时cp t I get cp illegal option t 对我来说这意味着提供的标志未实现 这是 b
  • 基准测试代码 - 我做得对吗?

    我想对 C C 代码进行基准测试 我想测量 CPU 时间 挂机时间和周期 字节 我编写了一些测量函数 但在周期 字节方面存在问题 为了获得CPU时间我写了一个函数getrusage with RUSAGE SELF 对于墙上的时间我用clo
  • 如何使用 WS-Security 在 BizTalk Server 中发送签名消息

    我希望 BizTalk 使用 WS Security 发送签名的肥皂消息而不加密 我的编排使用动态发送端口 我已经尝试了这两种方法 尝试像这样配置 WCF WSHttp 发送端口 暂时更改我的编排以使用此端口而不是动态端口 以及在我的编排中
  • 使用 rCharts 在 r 和shiny中创建传单热图

    我正在使用 Ramnath Vaidyanathan 的精彩演示 网址为http rmaps github io blog posts leaflet heat maps index html我想为我闪亮的应用程序重现他的热图 当我尝试在闪
  • 在张量流中使用两种不同的模型

    我尝试使用两种不同的移动网络模型 以下是我如何初始化模型的代码 def initialSetup os environ TF CPP MIN LOG LEVEL 2 start time timeit default timer This
  • 我无法使用 pyaudio 运行简单的代码 - [Errno -9996] 无效的输出设备(无默认输出设备)

    我是Python新手 我正在尝试运行一个关于 pyaudio 的简单代码 我刚刚复制并粘贴了在 pyaudio 网站上找到的代码 我收到此错误 OSError Traceback most recent call last
  • 将常量列表添加到 pandas 列

    假设我有一个 df df pd DataFrame a 1 2 3 b 4 5 6 我想要的只是添加一个新列 c 带有常量列表 例如 7 8 9 10 当我尝试时 df c 7 8 9 10 I get ValueError Length
  • 如何在ConstraintLayout上设置三分之一的布局宽度百分比?

    我想用 3x6 TextView 的二维网格填充屏幕 这意味着每个TextView必须是全屏宽度的1 3 高度是全屏高度的1 6 我对此布局使用 ConstraintLayout 因为 LinearLayout 对此布局来说是不好的做法 因
  • Firebase图片以异步等待方式上传

    async UPLOAD IMAGES try let self this var storageRef firebase storage ref var files document getElementById photoupload
  • 如何将应用程序名称添加到

    这是我的 app config 文件 如下所示
  • 更改 Woocommerce 购物车总数中的小数位数

    在 Woocommerce 中 我已在 Woocommerce 常规设置中将小数位数设置为 7 因此我可以显示产品价格像这样 0 0453321 我想知道我是否可以设置 舍入购物车总计仅保留 2 位小数 类似这样 2 34 正确的方法是仅更
  • 合并两个数组并对最后一个数组进行排序

    在一次采访中 我被问到以下问题 我有两个数组 它们都已排序 BUT 数组 1 将有少量 1 数组 2 的总数将与数组 1 中 1 的总数相同 所以在下面的例子中 array1 有三个 1 因此 array2 有 3 个数字 let say
  • 如果我在 using 语句结束之前返回会发生什么?会调用 dispose 吗?

    我有以下代码 using MemoryStream ms new MemoryStream code return 0 The dispose 方法在末尾调用using声明大括号 正确的 自从我return结束之前using声明 将Memo
  • JavaScript 命名空间的首选技术

    如果我不开始使用某种命名空间技术 我的代码将会变得一团糟 我对大型 javascript 项目的编程相对较新 但在 C java python 等系统编程方面拥有丰富的经验 基本上 我试图确定哪种方法是创建 javascript 命名空间的
  • Eclipse 中的外部输出文件夹

    eclipse中有没有办法使项目的输出文件夹成为外部文件夹 而不是位于项目根目录下的文件夹 是的 您可以将其定义为链接文件夹 这个这个所以回答更多 or this one 要创建新的链接文件夹 请选择New gt Folder 在文件夹名称
  • 通过 JWT 令牌在 Azure API 管理中进行授权

    我编写了一个入站策略 该策略启用 CORS 并根据授权服务器验证访问令牌 以下政策运行良好