2017-12-20 4 views
0

Ich möchte den Abfrageparameter für die Anforderung hinzufügen, indem ich die Antwort von meinem Authentifizierungsdienst verwende. Es handelt sich um das Beispiel:Azure-API-Gateway-Richtlinie

<policies> 
    <inbound> 
    <!-- Extract Token from Authorization header parameter --> 
    <set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization","JWT").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="false"> 
    <set-url>AUTH Service</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>@($"token={(string)context.Variables["token"]}")</set-body> 
    </send-request> 

    <choose> 
    <when condition="@((bool)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["active"] == false)"> 
     <return-response response-variable-name="existing response variable"> 
     <set-status code="401" reason="Unauthorized" /> 
     </return-response> 

    </when> 
    <otherwise> 
     <set-query-parameter name="domain_id" exists-action="append"> 
      <value> 
      @((string)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["content"]["domain_id"]) 
      </value> 
     </set-query-parameter> 
    </otherwise> 
    </choose> 

    <base /> 

</inbound> 
</policies> 

Aber ich bin immer diese Fehlermeldung:

{ 
    "messages": [ 
     { 
      "message": "Expression evaluation failed.", 
      "expression": "(string)((IResponse)context.Variables[\"tokenstate\"]).Body.As<JObject>()[\"content\"]", 
      "details": "Object reference not set to an instance of an object." 
     }, 
     "Expression evaluation failed. Object reference not set to an instance of an object.", 
     "Object reference not set to an instance of an object." 
    ] 
} 

Jede Idee, wie soll ich es tun?

Indem wir dekodiert JWT von meinem AUTH Service und fügte hinzu, es auf die Anfrage

Sie auf Backend Vielen

Antwort

1

Aus Performance-Gründen APIM Service vermeidet immer das Caching volle Request/Response-Stellen im Speicher, so dass, wenn Sie anrufen ((IResponse) context.Variables ["tokenstate"]). Body.As() Antwort wird direkt vom Auth-Server gestreamt und gleichzeitig in JObject konvertiert, so dass es nach diesem und zweiten Aufruf von .Body.As () wird Nullwert erzeugen.

Um zu vermeiden, dass Sie zwei Möglichkeiten:

  1. Anruf ((IResponse)context.Variables["tokenstate"]).Body.As<JObject>(true) - diese zusätzlichen Parameter Service Cache Antwort im Speicher anweist, so wird es für die spätere Inspektion aufbewahrt werden. Aber die Verwendung von Aufruf von .As() später erneut wird rohe Antwort wieder in JSON parsen, die gleiche Arbeit wieder zu tun und ein Leistungstreffer zu sein.
  2. oder tun Sie <set-variable name="tokenstate" value="((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()" />. Dies überschreibt den Wert der tokenstate-Variablen mit dem analysierten JSON-Body, der später mehrfach verwendet werden kann, da er jetzt im Speicher abgelegt wird.