2017-06-12 1 views
0

Ich habe eine API APP (sagen Rechner), auf dem ich AD-Authentifizierung mit Portal aktivieren. Ich habe die Calculator-API in den API-Verwaltungsdienst aufgenommen. Jetzt möchte ich, dass das OAuth-Token die Calculator-API aufruft. Ich lese dies postWie verbinde ich Azure AD authentifizierte API mit Oauth in API Management Service

In oben genannten, dass es erwähnt, erhalten Sie zuerst die Autorisierungscode & dann das Token. Ich habe alle AAD-Anwendungen gemacht & haben die Admin Zustimmung alles.

In APIM schrieb ich eine Politik den Autorisierungscode

<send-request mode="new" response-variable-name="responseObject" timeout="20" ignore-error="true"> <set-url>@("{{frontAuthServer}}?client_id={{clientId}}&response_type=code&redirect_uri={{FrontredirectUri}}&response_mode=query&resource={{scope}}")</set-url> <set-method>GET</set-method> </send-request> <return-response response-variable-name="existing response variable"> <set-status code="200" reason="OK" /> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> <set-body> @(new JObject(new JProperty("code",((IResponse)context.Variables["code"]).Body.As<JObject>())).ToString()) </set-body> </return-response>

zu bekommen, aber leider Autorisierungscode wird als Abfrageparameter in Reaktion kommenden & ich nicht in der Lage bin, es abzurufen Politik verwenden. Also ich will nur wissen, ob ich in die richtige Richtung gehe, Wenn ja, wie Abfrage Parameter aus der Antwort abrufen? ODER was wird der richtige Weg sein, dies zu tun? Ich folgte dem gleichen Weg mentioned here

aber kein Glück. Müssen Einstellungen vorgenommen werden? Fehle ich etwas?

Antwort

0

Wenn Ihr Ziel ist, fließen Sie in die Richtlinie, indem Sie Ihre API ohne OAuth-Token aufrufbar machen - dann sind Sie auf dem richtigen Weg. Wenn das Auth-Token als Abfrageparameter verwendet wird, sollte das, was Sie vom Server erhalten, 302 Response mit dem Location-Header sein. Tun Sie etwas wie unten:

<send-request mode="new" response-variable-name="responseObject" timeout="20" ignore-error="true"> 
    <set-url>@("{{frontAuthServer}}?client_id={{clientId}}&response_type=code&redirect_uri={{FrontredirectUri}}&response_mode=query&resource={{scope}}")</set-url> 
    <set-method>GET</set-method> 
</send-request> 

<set-variable name="token" value="@{ 
    var location = ((IResponse)responseObject).Headers.GetValueOrDefault("Location"); 
    if (string.IsNullOrEmpty(location)) { 
     return null; 
    } 

    var tokenStart = location.IndexOf("token="); 
    if (tokenStart >= 0) { 
     tokenStart += 6; 
     var tokenEnd = location.IndexOf("&", tokenStart); 
     if (tokenEnd < 0) { 
      tokenEnd = location.Length; 
     } 

     return location.Substring(tokenStart, tokenEnd - tokenStart); 
    } 
    return null; 
}" /> 

Nach diesem Token in Variable mit dem Namen "Token" zugänglich in Politik Ausdrücke wie context.Variables sein sollte [ "Token"].

+0

Ich habe einige Änderungen vorgenommen. Ich habe var location = ((IResponse) context.Variables ["responseObject"]). Headers.GetValueOrDefault ("Location"); um den Ort zu bekommen. Es gibt null zurück. –

+0

Ich bekomme nicht 302. Immer 200. –

+0

Es wäre vorteilhaft, den gesamten OAuth-Fluss mit einem Werkzeug wie Fiddler zu verfolgen, um zu verstehen, welche Anfragen erledigt werden und welche Antworten eingehen und wo das Token ist. Nach allem, was bekannt ist, wäre es möglich, das Clientverhalten innerhalb einer Richtlinie zu replizieren, um ein Token zu erhalten. –

Verwandte Themen