我已将node-red实例设置为Azure Web App,其唯一目的是创建一系列API Web服务。目前,这由Active Directory保护,简单有效。但是,最终我们希望公开提供一些API(可能通过Microsoft帐户)。这意味着需要在某种程度上打开对Web应用程序的访问,这让我感到紧张。
我想要做的是像反向代理服务那样将调用转发到一组受限制的URL路径。此外,为了避免向非AD帐户提供Web应用程序访问,我希望代理服务器上的守护程序服务代表服务帐户进行调用。
我希望这样的功能可以成为Azure API Management的一部分,但据我所知,它只是将所有API调用转发到后端进行身份验证。
寻找有关如何实现上述目标的建议。
答案 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>