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应用程序。 在虚拟控制台应用程序中强制同意表单是故意的,因为根据问题中的异常消息它是有意义的。 –

相关问题