2017-06-12 2 views
0

Ich habe eine node-red-Instanz als Azure Web App nur zum Erstellen einer Auswahl von API-Webdiensten eingerichtet. Gegenwärtig ist dies durch Active Directory gesichert, das einfach und effektiv ist. Letztendlich möchten wir jedoch einige der APIs öffentlich verfügbar machen (möglicherweise über Microsoft-Konten). Dies bedeutet, dass der Zugang zur Web-App etwas geöffnet werden muss, was mich nervös macht.Reverse-Proxy/Daemon in Azure

Was ich tun möchte, ist etwas wie ein Reverse-Proxy-Dienst, der Anrufe an eine begrenzte Menge von URL-Pfaden weiterleiten würde. Um zu vermeiden, dass ich einen Web-App-Zugang für Nicht-AD-Konten bereitstellen muss, möchte ich einen Daemon-Dienst auf dem Proxy, um die Aufrufe im Auftrag eines Dienstkontos durchzuführen.

Ich hatte gehofft, dass solche Funktionen Teil von Azure API Management sind, aber soweit ich es sagen kann, leitet es nur alle API-Aufrufe an das Backend zur Authentifizierung dort weiter.

Suchen Sie nach Vorschlägen, wie Sie das oben genannte erreichen können.

Antwort

0

Erstellen Sie 2 AAD-Apps: 1 für die node-red Backend-Webanwendung und 1 für APIM. Die App-URI-ID für das Back-End muss im folgenden Format vorliegen: "https: //****webappid****.azurewebsites.net/.auth/login/aad/callback".

Fügen Sie in APIM die Richtlinie für eingehende Daten hinzu (siehe unten) und fügen Sie die für Ihre Umgebung relevanten Werte ein.

<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> 
1

APIM verfügt über eine Richtlinien-Engine, mit der Sie verschiedene Dinge tun können. Eine davon könnte sein, Anrufe an Drittanbieterdienste als Teil der Verarbeitung von Clientanforderungen zu tätigen. Sie können also die Richtlinie SendRequest (https://docs.microsoft.com/en-us/azure/api-management/api-management-advanced-policies#SendRequest) in der Pipeline für die Anforderungsverarbeitung verwenden, um AAD mit clientId und secret aufzurufen, um das AAD-Token zu erhalten. Verwenden Sie ein wenig mehr Richtlinienausdrücke, um sie aus der Antwort zu extrahieren und an die Anfrage an das Backend anzuhängen.

+0

Klingt wie ein solider Plan. Ich habe mit der Verwendung der APIM-Richtlinie gespielt, um ein signiertes Anforderungs-Token zu erzeugen, das im Backend verifiziert werden muss, aber das würde bedeuten, dass die Backend-Schnittstellen nicht ideal sind (obwohl sie ohne ein gültiges Token nichts zurückgeben würden). Ich mag deine Idee besser. –