我已经创建了一个可以正常工作的多租户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的情况下接受同意书?
答案 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;最后将同意代表整个租户的申请。有了这种同意,您只需要为每个应用程序执行一次以使其正常工作。
我希望这有帮助!