1

Ich habe ein Szenario mit einem Mandanten in Azure Active Directory, in dem eine API1 eine andere API2 mithilfe der Authentifizierung aufrufen muss und die API1 aus einem SPA aufgerufen wurde.Verwenden Sie jwt, um API von einer anderen API aufzurufen

Wäre es richtig, nur die in API1 empfangene JWT des Benutzers aus dem SPA zu übergeben, um API2 zur Authentifizierung aufzurufen?

enter image description here

new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
    { 
     TokenValidationParameters = new TokenValidationParameters() { 
      SaveSigninToken = true, 
      ... 

wie in: https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

Alle APIs implementiert mit ASP.NET Web API und das SPA mit Active Directory-Authentifizierung Library (ADAL) für JavaScript.

Antwort

3

Das Token, das Sie vom ersten Schritt erhalten haben, wäre für den zweiten Schritt NICHT korrekt. Jedes Zugriffstoken hat eine bestimmte Zielgruppe, für die das Token vorgesehen ist. Da API 1 und API 2 unterschiedlich sind, kann der Zielgruppenwert dieses Tokens nur einer der beiden entsprechen.

Sie verknüpfen mit dem richtigen Beispiel, das ist der On-Behalf-Of-Fluss. Dieser Fluss ermöglicht API 1 das erste Token für ein neues Token auszutauschen, wo der Kunde wird API 1 und die Ressource wird API 2.

Sie eine Beschreibung des Protokolls finden here

// line breaks for legibility only 

POST /oauth2/token HTTP/1.1 
Host: login.microsoftonline.com 
Content-Type: application/x-www-form-urlencoded 

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer 
&client_id=625391af-c675-43e5-8e44-edd3e30ceb15 
&client_secret=0Y1W%2BY3yYb3d9N8vSjvm8WrGzVZaAaHbHHcGbcgG%2BoI%3D 
&resource=https%3A%2F%2Fgraph.windows.net 
&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.eyJhdWQiOiJodHRwczovL2Rkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tLzE5MjNmODYyLWU2ZGMtNDFhMy04MWRhLTgwMmJhZTAwYWY2ZCIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzI2MDM5Y2NlLTQ4OWQtNDAwMi04MjkzLTViMGM1MTM0ZWFjYi8iLCJpYXQiOjE0OTM0MjMxNTIsIm5iZiI6MTQ5MzQyMzE1MiwiZXhwIjoxNDkzNDY2NjUyLCJhY3IiOiIxIiwiYWlvIjoiWTJaZ1lCRFF2aTlVZEc0LzM0L3dpQndqbjhYeVp4YmR1TFhmVE1QeG8yYlN2elgreHBVQSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiJiMzE1MDA3OS03YmViLTQxN2YtYTA2YS0zZmRjNzhjMzI1NDUiLCJhcHBpZGFjciI6IjAiLCJlX2V4cCI6MzAyNDAwLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiJEVXpYbkdKMDJIUk0zRW5pbDFxdjZCakxTNUllQy0tQ2ZpbzRxS1MzNEc4IiwidGlkIjoiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwidW5pcXVlX25hbWUiOiJuYXZ5YUBkZG9iYWxpYW5vdXRsb29rLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidmVyIjoiMS4wIn0.R-Ke-XO7lK0r5uLwxB8g5CrcPAwRln5SccJCfEjU6IUqpqcjWcDzeDdNOySiVPDU_ZU5knJmzRCF8fcjFtPsaA4R7vdIEbDuOur15FXSvE8FvVSjP_49OH6hBYqoSUAslN3FMfbO6Z8YfCIY4tSOB2I6ahQ_x4ZWFWglC3w5mK-_4iX81bqi95eV4RUKefUuHhQDXtWhrSgIEC0YiluMvA4TnaJdLq_tWXIc4_Tq_KfpkvI004ONKgU7EAMEr1wZ4aDcJV2yf22gQ1sCSig6EGSTmmzDuEPsYiyd4NhidRZJP4HiiQh-hePBQsgcSgYGvz9wC6n57ufYKh2wm_Ti3Q 
&requested_token_use=on_behalf_of 
&scope=openid 
+0

Vielen Dank für Ihre klare Antwort, aber ich habe noch Zweifel. Dies wäre trotz der Tatsache, dass sich API2 auf demselben Azure-Mandanten befindet (wäre ein interner Aufruf), und ich könnte "potenziell" die gleiche Audience/ClientId in API2 wie in API1 verwenden? Es scheint nur eine "konzeptionelle" Einschränkung zu sein? Warum kann ich das nicht tun? Könnten Sie mich auf das Protokollkonzept hinweisen, das ich vermisse? – AlejandroC

+1

Wenn API 1 und API 2 dieselbe Client-ID und Anwendungs-ID-URI (Ressourcen-ID) verwenden, können sie absolut dasselbe Zugriffstoken verwenden ... Meine Frage an diesem Punkt ist, dass wirklich zwei verschiedene Dienste dargestellt werden? Ihr Bild impliziert zwei eindeutige Anwendungen, aber wenn sie die gleiche App-Registrierung teilen, gibt es keinen Unterschied in den Augen der Authentifizierung und Autorisierung. –

+1

Ich möchte hinzufügen, dass OAuth 2 letztlich verwendet wird, um die Ressource vor dem Ausgeben von Daten an die falschen Clients zu schützen . Ende des Tages könnte API 2 Zugriff auf jeden Client gewähren, der eine zufällige Zeichenfolge als Zugriffstoken übergibt. Und in dieser Hinsicht könnten Sie Ihre API so programmieren, dass sie Tokens mit der falschen Ressource im Zielgruppenanspruch akzeptiert ... Diese Auswahlmöglichkeiten sind auf Sie ausgerichtet, aber das wäre eine Abweichung von dem, was OAuth 2 angibt –

Verwandte Themen