Dot-Net

帶有 Azure AD 保護資源的 Postman 客戶端憑據流

  • March 13, 2019

我目前正在使用這個例子:

https://docs.microsoft.com/en-us/azure/active-directory/active-directory-authentication-scenarios#daemon-or-server-application-to-web-api

在 Azure AD 中使用 OAuth 檢查客戶端憑據流。從理論上講,該範例可以正常工作。客戶端 App 成功與伺服器 App 通信,首先從 Azure AD 令牌 url 獲取 OAuth 令牌。那裡沒有問題。但是,我正在嘗試使用 Postman 檢查客戶端憑據流,但我無法使其正常工作。

在 Postman 中,我應該提供Access Token UrlClient IDClient SecretGrant Type設置為Client Credentials使用與https://github.com/Azure-Samples/active-directory-dotnet-daemon中 Microsoft 範例提供的範例相同的參數,我在嘗試訪問 Web 服務時收到401響應。我認為主要原因是因為在 Postman 中,我無法輸入資源我想訪問,所以收到的令牌沒有“連結”到任何資源,這就是 Web 伺服器中授權失敗的原因?這可能是原因嗎?如果這是原因,那麼我應該在伺服器上做什麼,因為不知何故,郵遞員的要求似乎應該是客戶端憑證流中有效的要求(我的意思是,根據 OAuth2 客戶端憑證,不應該提供任何資源流,對吧?

這是從 Microsoft 範例下載的範例中 Starup 類的程式碼

   // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
   public void ConfigureAuth(IAppBuilder app)
   {
       app.UseWindowsAzureActiveDirectoryBearerAuthentication(
           new WindowsAzureActiveDirectoryBearerAuthenticationOptions
           {
               Audience = ConfigurationManager.AppSettings["ida:Audience"],
               Tenant = ConfigurationManager.AppSettings["ida:Tenant"]
           });
   }

**ConfigurationManager.AppSettings$$ “ida:Tenant” $$**是我的 Azure AD 租戶,而 **ConfigurationManager.AppSettings$$ “ida:Audience” $$**是我需要訪問的受保護資源。這兩個值都是必需的,如果我不提供 Audience,我會在 .NET Web API 初始化中收到錯誤。

編輯

我認為問題在於 Azure 令牌伺服器不接受作為授權標頭髮送的客戶端憑據。例如

Authorization: Basic YmE1NTZlYmItZGY2OS00NjBhLWEwMjItNTI0NWQ0MzA2N2UxOmVxVzlqaXRobXF2cVFiVWY5dmxaWnhZN2wwUzZhQ0pHSkExSGt0eUd3N0W6

但這就是 Postman 的“獲取新訪問令牌”工具發送它的方式。所以它是行不通的。

如果您查看Microsoft 的文件並蒐索“獲取令牌”,您會發現這意味著應該在正文中提供客戶端憑據。

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

client_id=535fb089-9ff3-47b6-9bfb-4f1264799865&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=qWgdYAmab0YSkuL1qKv5bPX&grant_type=client_credentials

這工作正常,但似乎與Oauth 2.0 規範相矛盾,該規範說:

授權伺服器必須支持 HTTP Basic 身份驗證方案,以對已獲得客戶端密碼的客戶端進行身份驗證。

結束編輯

您絕對可以在不提供資源的情況下取回不記名令牌。

請注意,resource在上一個答案的郵遞員 http 正文中甚至沒有正確拼寫 - 它的拼寫resrource是因為它的值被忽略並且與響應中發回的https://graph.microsoft.com不匹配。雖然很有趣,但它們都與 api 圖有關……但這是題外話。resource``(00000002-0000-0000-c000-000000000000)

令人困惑的是,有兩種方法可以向 Oauth 2.0 伺服器提供客戶端憑據,而有些伺服器不接受這兩種方式!

  • 1 添加一個basic auth設置為 Base64(ClientId + “:” + ClientSecret) 的標頭
  • 2是在請求正文中添加clientId和clientSecret。

我想這就是 Oauth 2.0 是規範而不是協議的問題……見 - https://www.rfc-editor.org/rfc/rfc6749#section-2.3.1

Postman 的請求令牌 UI(見下圖)使用方法 1,但 Azure 身份驗證伺服器需要方法 2。我知道是因為我執行了 fiddler,並且可以看到請求郵遞員放在一起。

如果您手動將客戶端憑據放在正文中,例如

grant_type=client_credentials&scope=&client_id=ba556ebb-xxxx9-460a-ax2x-5245d43067e1&client_secret=eqW9jighghghgvlZZxY7l0S6aCJGJA1HktyGw7E=

並且不要使用Basic Authhttp 標頭。即使不提供資源,您也可以獲得不記名令牌。

這很好用 - 但顯然這對您使用郵遞員獲取和儲存您的令牌沒有好處!

在此處輸入圖像描述

引用自:https://stackoverflow.com/questions/40641616