如何使用AppAuth从iOS应用程序使用Azure AD进行身份验证?

Ola*_*avT 5 ios azure-active-directory adal openid-connect

我将此示例与Google合作作为ID提供程序:

https://github.com/jchnxu/TestOIDAppAuth-iOS

该示例在Swift中使用iOS中的AppAuth库和Open Id Connect.我没有使用ADAL,因为它似乎不支持Swift 3.

My iOS app bundle is:

webinnovation.no.Test
Run Code Online (Sandbox Code Playgroud)

我在ViewController.swift中配置了以下常量:

let kIssuer = "https://accounts.google.com"
let kClientID = "<my id from Google>.apps.googleusercontent.com"
let kRedirectURI = "com.googleusercontent.apps. <my id from Google>:oauthredirect"

In plist.info: “com.googleusercontent.apps. <my id from Google>”
Run Code Online (Sandbox Code Playgroud)

这与Google ID提供商一样有效.我得到一个登录对话框,登录后它正确解除,应用程序正确获取一个令牌.

但是,如何将其映射到Azure AD?

我试过这样的组合:

let kIssuer = "https://login.microsoftonline.com/webinnovation.onmicrosoft.com"
let kClientID = "<my Application ID from Azure AD>"
let kRedirectURI = "no.webinnovation.Test://oauth/redirect"

In info.plist: "no.webinnovation.Test"
Run Code Online (Sandbox Code Playgroud)

这种工作.我在iOS设备上显示Azure AD身份验证对话框,但在输入我的凭据后,对话框不会被正确解除,并且应用程序不会获得任何令牌.流动的停止.如果单击"完成",Azure AD对话框将消失,但AppAuth调用将返回错误,并且用户未经过身份验证.

我怀疑有一些与重定向URI相关的问题,但我找不到正确的方法.

Bra*_*ner 6

Azure AD确实在我们最新的MSAL库中支持Swift 3,并在Swift中提供代码示例来帮助您.但是,Azure Active Directory绝对支持App Auth. 您只需设置一个重定向URI,该URI可以回调您的应用程序并为您的租户使用正确的Issuer.

这就是你遇到的问题.登录成功,但Azure无法找到它回到您的应用程序!

首先,一些基础工作.

系统Webview

大多数现代OAuth2库现在使用System Webview对用户进行签名.系统Webview是一个应用程序可以启动的浏览器组件,它似乎是应用程序的一部分,但实际上是一个运行操作系统Web浏览器的独立进程.对于iOS来说,这就是SFSafariViewControllerAndroid上的Chrome Custom Tabs.

系统Webview为用户演唱的好处很多,包括:

  • 安全性更好.应用程序无法访问输入到系统Webview的凭据,因为它是一个独立的浏览器进程.

    今天,许多应用程序使用用户名和密码表单或嵌入式webview来获取凭据.这允许应用程序监听并获取这些凭据.许多公司已经开始禁止具有此类登录功能的应用程序.系统Web视图可确保您的应用程序不会出现此问题.

  • 单点登录.用户使用系统Webview登录后,会在浏览器中放置一个cookie,该帐户可供任何应用程序使用,从而无需用户单独登录每个应用程序.

    随着越来越多的消费者和企业利用手机短信和其他因素作为额外的步骤,不得不重做这一步以及使用您的密码对客户来说非常烦人.系统Web视图删除此问题.

  • 更好的控制.用户可以选择提供应用程序的帐户,或者在系统Webview中添加全新帐户(如果支持).

您已经看到Google和Microsoft使用我们最新的SDK转换到此系统Webview,并更新我们的身份服务,并为客户提供这些保护和功能.来自OpenID项目的App Auth也提供了这种支持,该项目由Google和Microsoft工程师共同提供.

系统Webview需要返回到您的应用程序

阅读上述内容可能会发生的一件事是:

如果应用程序现在调用系统Webview进行登录,并且无法控制它,如何从系统Webview获取我需要的令牌?

答案是您必须利用每个操作系统必须回调应用程序的机制,然后使用redirectURIOAuth2协议使用该机制将响应返回给该应用程序.这几乎与它在Web浏览器中的工作原理完全一样.您将从网站重定向到身份提供程序以进行登录,然后身份提供程序使用该redirectURI命令将用户返回到具有响应某处的令牌的网站.

对于iOS,这通过自定义URL方案完成.URL方案的格式为CFBundleURLScheme:\\CFBundleURLSchemes,并定义为:

  • CFBundleURLName 包含URL方案的抽象名称的字符串.为确保唯一性,建议您指定反向DNS样式的标识符,例如com.acme.myscheme.您指定的字符串也用作应用程序的InfoPlist.strings文件中的键.密钥的值是人类可读的方案名称.
  • CFBundleURLSchemes 包含URL方案名称的字符串数组 - 例如,http,mailto,tel和sms.

要为您的应用注册网址类型,请CFBundleURLTypes在应用的Info.plist文件中包含该密钥.该CFBundleURLTypes键包含一个字典数组,每个字典都定义了应用程序支持的URL方案.

如何让系统Webview返回到您的应用程序

所以,结合这两件事,你需要做的事情很简单:

  1. 找出你的应用程序的URL方案(例如appauth://abc123.
  2. 告诉Azure AD您的新URL方案是什么,将其添加redirectURI为您的应用程序的另一个 .
  3. 配置应用程序以侦听此URL方案并启动应用程序
  4. 配置应用程序本身以在此URL方案启动应用程序后获取令牌(App Auth,以及我们自己的MSAL库,为您执行此操作!)

1.确定您的应用程序的URL方案

您可以从Apple的Inter-App Communication文档中了解如何制作URL方案,但我们建议您使用appauth://<client id>(例如appauth://ab032846-efee-481f-b6bc-493aae92c432)方案

2.告诉Azure AD您的新URL方案是什么

您需要将此URL方案作为RedirectURI添加到您的应用程序.这很容易做到.只需访问https://apps.dev.microsoft.com/并选择您的应用程序即可.向下滚动到自定义应用程序URI下Native Applications,添加新的redirectURI!

您需要输入此信息的开发人员门户中的位置快照

3.配置应用程序以侦听此URL方案

info.plist根据Apple在应用程序间通信中的说明,将以下内容添加到您的文件中.它应该看起来像这样,虽然不同的应用程序将注册不同的和额外的URL方案:

  <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLName</key>
            <string>ab032846-efee-481f-b6bc-493aae92c432</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>app-auth</string>
            </array>
        </dict>
    </array>
Run Code Online (Sandbox Code Playgroud)

4.配置应用程序本身以获取令牌

虽然侦听从Web浏览器到应用程序的响应是所有iOS应用程序的众所周知的模式,但实际的实现因您使用的标识SDK而异,因此您应该查看文档.你这么做是很重要的.对于App Auth,他们会告诉您将以下代码放入您的AppDelegate.m文件中:

/*! @brief Handles inbound URLs. Checks if the URL matches the redirect URI for a pending
        AppAuth authorization request.
 */
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<NSString *, id> *)options {
  // Sends the URL to the current authorization flow (if any) which will process it if it relates to
  // an authorization response.
  if ([_currentAuthorizationFlow resumeAuthorizationFlowWithURL:url]) {
    _currentAuthorizationFlow = nil;
    return YES;
  }

  // Your additional URL handling (if any) goes here.

  return NO;
}
Run Code Online (Sandbox Code Playgroud)

一旦你知道上面的背景,代码就很容易理解了:这就是通过获取返回的URL然后将该URL中的所有内容返回给应用程序来接收来自身份服务的响应,这样它就可以获取令牌需要继续它的工作.

而已!

您的应用现在应该可以使用Azure Active Directory.System Webview的这种模式在许多身份提供商(Microsoft,Google,Facebook)和移动平台上都很常见.

奖金内容

如上所述,Microsoft是OpenID工作组的贡献者,并支持App Auth开发.因此,这是一个拉取请求,可以帮助您解决任何问题:https://github.com/brandwe/AppAuth-iOS/tree/dev/Examples

它目前在使用/ common端点时存在问题,但是否则我在上面提到的所有解决方案都在代码中表示!


小智 -1

恐怕我无法对此给出答案,但经过我自己的调查,我可以建议这不是重定向 URI 问题。我还可以建议,这是login.live.com和login.microsoftonline.com之间的差异(live可以工作,而microsoftonline.com则不能),而且login.microsoftonline.com可以在Windows环境中工作,但不能在IOS环境中工作一