方案:我已经拥有一个与Azure SSO兼容的注册多租户Web应用程序。我现在正在开发一个iOS应用程序,它也将支持应用程序的SSO身份验证。
根据https://azure.microsoft.com/en-us/resources/samples/active-directory-ios/中提供的示例,我为iOS应用创建了一个原生应用,其中包含来自我的WebApp的委派权限(参考:https://stackoverflow.com/a/29810124)。
这适用于创建应用的AAD中存在的任何用户。但是,只要我想从之前授权WebApp的其他域中进行SSO,我就会收到错误:
Application with identifier 'CLIENT_ID_HERE' not found in directory DOMAIN_HERE.onmicrosoft.com
这意味着本机应用程序不是多租户?考虑到域外用户应该可以将SSO应用到应用程序中,这似乎有点奇怪。
目前,对于基于浏览器的SPA,我只需手动调用常见的Azure登录页面即可同意并获取用户的授权码。然后,我将此代码发送到后端(WebApp),后端执行OAuth握手并获取有效令牌。这不需要应用程序中的client_secret
,因为SPA实际上并不执行令牌检索。
因此,当我尝试使用WebApp的client_id
时(类似于https://stackoverflow.com/a/27033816建议的内容)我遇到了Azure AD iOS SDK的错误,要求我提供客户端密码为好。似乎SDK正在抽象相当数量并为您抓取令牌,而不是在我只需获取授权代码并将其发送到我的WebApp时执行一个步骤。
TLDR:我的要求与multiple-tenant, multiple-platform, multiple-services single sign-on using Azure Active directory中列出的要求非常相似,我有多个客户端(浏览器,iOS,Android)都需要能够使用Azure SSO。我假设移动应用程序应该能够使用我现有的WebApp来验证用户。
上一篇SO帖子的回答中提出的问题在某种程度上解释了我的问题:
我的移动应用如何代表用户访问我的多租户网络API?
答案 0 :(得分:1)
目前,在Azure门户网站上注册的本机应用程序不支持多租户。您可以考虑使用也支持Microsoft帐户的V2.0 endpoint。
TLDR:我的要求与使用Azure Active目录的多租户,多平台,多服务单点登录中概述的要求非常类似,我有多个客户端(浏览器,iOS,Android),所有这些都需要能够使用Azure SSO。我假设移动应用程序应该能够使用我现有的WebApp来验证用户。
您的意思是说有不同的字体结尾而且多租户Web应用程序是后端吗?在这种情况下,无需在门户网站上注册另一个本机客户端应用程序,您可以参考here关于为iOS应用程序添加身份验证。
答案 1 :(得分:1)
因此,Microsoft的大多数教程都使用他们的AAD SDK来生成OAuth访问令牌,而我需要简单地将authorization_code
发送到后端,该后端已注册为现有的多租户Web应用程序,因此它可以正常使用自己的client_id生成令牌。
这是使用AD OAuth code documentation中的正确redirect_uri
完成的:
对于本地人和移动应用,您应使用默认值
urn:ietf:wg:oauth:2.0:oob
请注意,发送urn:ietf:wg:oauth:2.0:oob
实际上会导致多租户OAuth登录页面(https://login.windows.net/common/oauth2/authorize
)出现架构错误,因此您必须改为使用https://login.microsoftonline.com/common/oauth2/nativeclient
。