1

我在Azure Active Directory中有一個租戶方案,其中API1需要使用身份驗證調用另一個API2,以及API從SPA調用的位置。重新使用jwt從另一個API調用API

將SPA中API1接收到的用戶JWT傳遞給API2進行認證是否正確?

enter image description here

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

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

所有API與的ASP.NET Web API和使用Active Directory驗證庫(ADAL)對JavaScript的SPA實現。

回答

3

傳遞你從第一步得到的令牌在第二步中是不正確的。每個訪問令牌都有該令牌的特定受衆,並且由於API 1和API 2不同,該令牌的受衆值只能匹配其中一個。

您鏈接到正確的樣本,這是代表流的代表。這種流動允許API 1交換的第一個標記爲一個全新的令牌,其中客戶端變得API 1和資源變爲API 2.

您可以找到該協議的描述爲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

謝謝您明確的答案,但我仍然有疑問。儘管API2位於同一個Azure租戶(這是一個內部調用),並且我可能「可能」使用API​​2中與API1中相同的Audience/ClientId? 它看起來只是一個「概念」限制?爲什麼我不能這樣做?你能否說出/引薦我缺失的協議概念? – AlejandroC

+1

如果API 1和API 2使用相同的客戶端ID和應用程序ID uri(資源標識符),那麼他們絕對可以共享相同的訪問令牌......我的問題在那時確實代表兩種不同的服務嗎?您的圖片意味着兩個獨特的應用程序,但如果它們共享相同的應用程序註冊,那麼在認證和授權方面沒有任何區別 –

+1

我想補充一點,最終,OAuth 2用於保護資源免於向錯誤的客戶端提供數據。當天結束時,API 2可以訪問任何傳遞隨機字符串作爲訪問令牌的客戶端。在這方面,你可以編程你的api,以接受在觀衆聲稱中有錯誤資源的標記......這些選擇都在你身上,但這與OAuth 2指定的內容有所不同 –