如何使用Visual Studio测试适配器测试Azure AD保护的Web API?

时间:2016-12-14 15:56:48

标签: oauth-2.0 integration-testing azure-active-directory adal visual-studio-test-runner

我已经创建了一个可以正常工作的多租户Web API。现在我想构建一个本机客户端进行测试。 Web API应用程序在一个租户中定义。测试应用程序在另一个已授予Web API管理员同意权的租户中定义。

我想在我的(非交互式)集成测试中使用本机应用程序使用用户名和密码进行身份验证。我不能使用证书/仅应用程序身份验证,因为我需要一个真实的用户上下文。

获取令牌

var userCredential = new UserCredential("admin@clienttenant.onmicrosoft.com", "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的情况下接受同意书?

1 个答案:

答案 0 :(得分:2)

目前没有其他方式来写用户同意而没有某种用户体验。 (这有道理吗?)

如果您使用Azure管理门户,作为租户的管理员,您创建的所有应用程序都应自动获得所选资源的同意。这是因为Azure管理门户特别会在您保存客户端应用程序时编写这些同意链接。

如果您使用其他门户或API来创建应用程序,则需要至少一次同意该应用程序。您无需在应用程序上设置提示行为即可获得同意屏幕。您只需生成用于登录您的应用程序的URL,这也将带您完成同意体验:

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

请注意,我们添加了&#34;提示= admin_consent&#34;最后将同意代表整个租户的申请。有了这种同意,您只需要为每个应用程序执行一次以使其正常工作。

我希望这有帮助!