帶有 Azure AD 保護資源的 Postman 客戶端憑據流
我目前正在使用這個例子:
在 Azure AD 中使用 OAuth 檢查客戶端憑據流。從理論上講,該範例可以正常工作。客戶端 App 成功與伺服器 App 通信,首先從 Azure AD 令牌 url 獲取 OAuth 令牌。那裡沒有問題。但是,我正在嘗試使用 Postman 檢查客戶端憑據流,但我無法使其正常工作。
在 Postman 中,我應該提供Access Token Url、Client ID和Client Secret,Grant 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 標頭。即使不提供資源,您也可以獲得不記名令牌。這很好用 - 但顯然這對您使用郵遞員獲取和儲存您的令牌沒有好處!
