我已经创建了一个可以正常工作的多租户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;
此代码的问题是,即使我已将管理员同意给本机应用程序,即使用户与App注册相同的租户,它也不起作用。
异常投掷:
'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 Management Portal作为租户的管理员,则应自动同意您选择的资源。这是因为Azure管理门户专门将在保存客户端应用程序时编写这些同意链接。
如果您使用其他门户或API来创建您的应用程序,则需要至少一次同意该应用程序。您无需在申请上将及时的行为放在申请中即可获得同意屏幕。您只需生成用于登录您的应用程序的URL,这也将带您通过同意经验:
https://login.microsoftonline.com/<TenantID>/oauth2/authorize?client_id=<AppID>&response_type=code&redirect_uri=<RedirectURI>&resource=<ResourceURI>&prompt=admin_consent
请注意,我们在最后添加了一个"提示= admin_consent",该命令将同意整个租户的申请。通过这种同意,您只需要每次应用程序一次才能使其正常工作。
我希望这会有所帮助!