0

我已經創建了一個很好的多租戶Web API。現在我想構建一個本地客戶端進行測試。 Web API應用程序在一個租戶中定義。測試應用程序在另一個已授予Web API管理員同意的租戶中定義。如何使用Visual Studio測試適配器測試Azure AD受保護的Web API?

我想在我的(非交互式)集成測試中使用本機應用程序使用用戶名和密碼進行身份驗證。我不能使用證書/應用程序唯一身份驗證,因爲我需要真正的用戶上下文。

獲得令牌

var userCredential = new UserCredential("[email protected]", "password"); 
var context = new AuthenticationContext("https://login.windows.net/common"); 

return context.AcquireToken("https://webapitenant.onmicrosoft.com/webApiResourceUri", testClientId, userCredential).AccessToken; 

的這段代碼的問題是,它不工作,直到我給管理員同意的本機應用程序,即使用戶是同一用戶的應用程序註冊。

拋出異常:

'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException' in Microsoft.IdentityModel.Clients.ActiveDirectory.dll 

Additional information: 
AADSTS65001: The user or administrator has not consented to use the application with ID 'nativeclientid'. Send an interactive authorization request for this user and resource. 

由於測試是不是交互式我要創建一個使用上面的代碼但PromptBehaviour.Always一個控制檯應用程序。這會提示我輸入用戶名和密碼並顯示同意書。在我同意後,使用相同本機應用程序註冊的測試開始工作。

有沒有辦法在沒有交互式GUI的情況下接受同意書?

回答

2

目前沒有其他方式可以在沒有某種用戶體驗的情況下編寫用戶許可。 (這是什麼意思?)

如果您使用Azure管理門戶,作爲租戶的管理員,您創建的所有應用程序應自動同意您選擇的資源。這是因爲Azure管理門戶專門會在保存您的客戶端應用程序時編寫這些同意鏈接。

如果您使用其他門戶或API來創建您的應用程序,那麼您至少需要同意該應用程序一次。您無需爲了獲得同意屏幕而在您的應用程序中提示行爲。你可以只生成URL的登錄到您的應用程序,這也將帶您同意的經驗:我們在此將同意申請末尾添加一個「提示= admin_consent」

https://login.microsoftonline.com/<TenantID>/oauth2/authorize?client_id=<AppID>&response_type=code&redirect_uri=<RedirectURI>&resource=<ResourceURI>&prompt=admin_consent 

注意導通代表整個租戶。有了這種同意,您只需要在每個應用程序中執行一次即可使其工作。

我希望這有助於!

+0

您確定自動同意在門戶中創建的應用程序嗎?我在門戶中創建了本地客戶端,仍然收到同意書。測試用戶與本機應用程序位於同一目錄中。然而,web api位於不同的租戶中。 –

+0

特別是作爲管理員,是記錄是的同意。過去,Native Client應用程序沒有記錄同意,但我的理解是,這已經被修復,所以它也應該與本地客戶端一起工作。最後,您可能會發現,在您的代碼中,您'提示同意',無論您是否已經同意,都會強制進行同意對話。讓我知道如果你仍然得到這種行爲,也許我們可以調試你的網站的經驗。 –

+0

如果我沒有記錯的話,只要Web API和Native Client在同一個租戶中註冊,就可以像您說的那樣工作。在我的情況下,我想對遠程服務器運行測試,因爲本地調試比等待並排除VSTS生成輸出故障更容易。在不同租戶中開發應用程序的原因是開發人員只需在自己的租戶中配置自己的本地應用程序,然後在共同租戶中共享web api應用程序。 在虛擬控制檯應用程序中強制同意表單是故意的,因爲根據問題中的異常消息它是有意義的。 –

相關問題