【问题标题】:Validating Authorization token in incoming requests with Azure API management and third party Authorization Server使用 Azure API 管理和第三方授权服务器验证传入请求中的授权令牌
【发布时间】:2019-07-04 13:44:54
【问题描述】:

我必须使用第三方授权服务器在我的项目中实施 OAuth 2.0。我的客户端和服务器都已经在 AS 上注册了。我在 Azure 上创建了一个 API 管理实例并导入了 swagger API。我希望针对我的 AS 验证每个传入请求,因此我只需将请求重定向到 https://my-as.com/as/introspect.oauth2,并验证令牌。如果令牌有效,则让它继续,否则发送 401。我试图使用“入站处理”来实现这一点,并参考了以下文档:https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-protect-backend-with-aad#configure-a-jwt-validation-policy-to-pre-authorize-requests

唯一的问题是我使用的是第三方 AS 而不是 Azure AD。我尝试用我的 URL 替换示例 XML 代码中的 URL,但它不起作用。

如何将请求重定向到授权服务器以验证访问令牌?

【问题讨论】:

  • 嗨....请问您遇到了什么问题?感谢您的具体错误信息或疑虑
  • 我应该在我的 Azure APi 管理实例上添加什么配置来使用第三方授权服务器 (my-as.com/as/introspect.oauth2) 验证访问令牌? PS - 我正在尝试在这里实现授权代码授予 OAuth。
  • 只需检查此链接.... 我已经使用 ADFS 和 AAD 完成了这个场景。但不适用于第三方服务器。 auth0.com/docs/integrations/azure-api-management/…
  • 我已经按照文档中提到的步骤进行操作。目前在开发人员门户中,我能够从 AS 获取令牌并将其作为标头发送(如文档中所述),但是如果我的 API 网关直接使用/不使用令牌怎么办?我的目标是在将每个请求发送到导入的 API 之前对有效令牌的每个请求进行预处理(通过询问 AS 令牌是否有效)。
  • 我只是想修改这一步,用第三方AS代替Azure AD - docs.microsoft.com/en-us/azure/api-management/…

标签: azure oauth-2.0 authorization azure-active-directory azure-api-management


【解决方案1】:

添加以下入站策略有效:

<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://my-as.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=UoM&client_secret=somesecret&token={(string)context.Variables["token"]}")</set-body>
        </send-request>
        <choose>
            <!-- Check active property in response -->
            <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>

【讨论】:

  • 非常感谢!我正在遵循 Microsoft AD 路径,并且真的很难找到外部 idp 的示例。这对我有帮助
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2020-02-12
  • 2014-07-02
  • 2021-01-28
相关资源
最近更新 更多