0

我创建了一个运行良好的多租户 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 的情况下接受同意书?

4

1 回答 1

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

请注意,我们在末尾添加了一个“prompt=admin_consent”,它将代表整个租户同意该应用程序。有了这种同意,您只需为每个应用程序执行一次即可使其正常工作。

我希望这有帮助!

于 2016-12-14T20:28:47.670 回答