我已经创建了一个很好的多租户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的情况下接受同意书?
您确定自动同意在门户中创建的应用程序吗?我在门户中创建了本地客户端,仍然收到同意书。测试用户与本机应用程序位于同一目录中。然而,web api位于不同的租户中。 –
特别是作为管理员,是记录是的同意。过去,Native Client应用程序没有记录同意,但我的理解是,这已经被修复,所以它也应该与本地客户端一起工作。最后,您可能会发现,在您的代码中,您'提示同意',无论您是否已经同意,都会强制进行同意对话。让我知道如果你仍然得到这种行为,也许我们可以调试你的网站的经验。 –
如果我没有记错的话,只要Web API和Native Client在同一个租户中注册,就可以像您说的那样工作。在我的情况下,我想对远程服务器运行测试,因为本地调试比等待并排除VSTS生成输出故障更容易。在不同租户中开发应用程序的原因是开发人员只需在自己的租户中配置自己的本地应用程序,然后在共同租户中共享web api应用程序。 在虚拟控制台应用程序中强制同意表单是故意的,因为根据问题中的异常消息它是有意义的。 –