如何使用 Visual Studio 测试适配器测试受 Azure AD 保护的 Web API?
How do I test a Azure AD protected Web API in with Visual Studio Test Adapter?
我创建了一个运行良好的多租户 Web API。现在我想构建一个本地客户端进行测试。 Web API 应用程序在一个租户中定义。测试应用程序是在另一个租户中定义的,该租户已授予管理员对 Web API.
的同意
我想在我的(非交互式)集成测试中使用本机应用程序通过用户名和密码进行身份验证。我无法使用 certificate/app-only 身份验证,因为我需要真实的用户上下文。
获取令牌
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 的情况下接受同意书?
目前没有其他方式可以在没有某种用户体验的情况下编写用户同意书。 (哪个说得通?)
如果您使用 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",这将代表整个租户同意申请。获得此类许可后,您只需为每个应用程序执行一次即可使其正常运行。
希望对您有所帮助!
我创建了一个运行良好的多租户 Web API。现在我想构建一个本地客户端进行测试。 Web API 应用程序在一个租户中定义。测试应用程序是在另一个租户中定义的,该租户已授予管理员对 Web API.
的同意我想在我的(非交互式)集成测试中使用本机应用程序通过用户名和密码进行身份验证。我无法使用 certificate/app-only 身份验证,因为我需要真实的用户上下文。
获取令牌
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 的情况下接受同意书?
目前没有其他方式可以在没有某种用户体验的情况下编写用户同意书。 (哪个说得通?)
如果您使用 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",这将代表整个租户同意申请。获得此类许可后,您只需为每个应用程序执行一次即可使其正常运行。
希望对您有所帮助!