Azure中的反向代理/守护程序

时间:2017-06-12 02:19:21

标签: node-red azure-web-app-service azure-api-management

我已将node-red实例设置为Azure Web App,其唯一目的是创建一系列API Web服务。目前,这由Active Directory保护,简单有效。但是,最终我们希望公开提供一些API(可能通过Microsoft帐户)。这意味着需要在某种程度上打开对Web应用程序的访问,这让我感到紧张。

我想要做的是像反向代理服务那样将调用转发到一组受限制的URL路径。此外,为了避免向非AD帐户提供Web应用程序访问,我希望代理服务器上的守护程序服务代表服务帐户进行调用。

我希望这样的功能可以成为Azure API Management的一部分,但据我所知,它只是将所有API调用转发到后端进行身份验证。

寻找有关如何实现上述目标的建议。

2 个答案:

答案 0 :(得分:1)

APIM有可用于执行各种操作的策略引擎。其中之一可能是作为客户端请求处理的一部分来调用第三方服务。因此,您可以在请求处理管道中使用SendRequest(https://docs.microsoft.com/en-us/azure/api-management/api-management-advanced-policies#SendRequest)策略来使用clientId和secret调用AAD来获取AAD令牌。使用更多的策略表达式从响应中提取它并将其附加到对后端的请求。

答案 1 :(得分:0)

创建2个AAD应用程序:1个用于节点红色后端Web应用程序,1个用于APIM。后端的App URI ID必须采用以下格式: “HTTPS://****webappid****.azurewebsites.net/.auth/login/aad/callback”。

在APIM中,添加入站策略,如下所示,插入与您的环境相关的值。

 <policies>
    <inbound>
        <!--          Authenticate as the "Azure API Management Service" app in AD and get token to authenticate with backend          -->
        <!--      Active Directory tenant      -->
        <set-variable name="tenantid" value="****your AD tenant id here****"/>
        <!--      Application id of APIM Service app in Active Directory      -->
        <set-variable name="clientid" value="*** your application id here****"/>
        <!--      Key from APIM Service app in Active Directory      -->
        <set-variable name="key" value="*** your application key here****"/>
        <!--      App ID UR for the backend app in Active Directory      -->
        <set-variable name="audience" value="https%3A%2F%2F****your backend web app id here****.azurewebsites.net%2F.auth%2Flogin%2Faad%2Fcallback"/>
        <send-request mode="new" response-variable-name="reply" timeout="10" ignore-error="false">
            <set-url>@("https://login.microsoftonline.com/"+context.Variables.GetValueOrDefault<string>("tenantid")+"/oauth2/token")</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=client_credentials&client_id="+context.Variables.GetValueOrDefault<string>("clientid")+"&client_secret="+context.Variables.GetValueOrDefault<string>("key")+"&resource="+context.Variables.GetValueOrDefault<string>("audience"))</set-body>
        </send-request>
        <!--          Extract token from reply          -->
        <set-variable name="accesstoken" value="@((String)((IResponse)context.Variables["reply"]).Body.As<JObject>()["access_token"])"/>
            <!--          Add authentication token to request          -->
            <set-header name="Authorization" exists-action="override">
                <value>@("Bearer " + context.Variables.GetValueOrDefault<string>("accesstoken"))</value>
            </set-header>
        </inbound>
        <backend>
            <forward-request/>
        </backend>
        <outbound/>
    </policies>