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

我有这个例子与谷歌作为ID提供者:

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

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

My iOS app bundle is: webinnovation.no.Test 

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

 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>” 

Google Id提供者可以按预期工作。 我得到一个login对话框,并login后正确解散,应用程序正确地获得一个令牌。

但是,如何将其映射到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" 

这种工作。 我的iOS设备上显示Azure AD身份validation对话框,但input我的凭据后,对话框不会正确解除,应用程序也不会取回任何令牌。 stream程种类的停止。 如果我点击“完成”Azure AD对话框消失,但是然后AppAuth调用返回一个错误,并且用户未被authentication。

我怀疑有一些与redirectURI相关的问题,但我没有find正确的方法来做到这一点。

Azure AD实际上在我们最新的MSAL库中支持Swift 3,并且在Swift中有代码示例来帮助你。 但是, Azure Active Directory完全支持App Auth。 您只需要设置一个redirectURI,可以callback您的应用程序,并为您的租户使用正确的发行人。

这是你正在运行的问题。 login成功,但Azure无法find回到您的应用程序的方式!

首先,一些基础。

系统Webviews

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

System Webview对用户唱歌的好处很多,其中包括:

  • 更好的安全性 应用程序无法访问键入到系统Web视图中的凭据,因为它是一个独立的浏览器进程。

    今天,许多应用程序使用用户名和密码表单或embedded式webview来获取凭据。 这允许应用程序侦听并获取这些凭证。 许多公司已经开始禁止有这种login的应用程序。系统Webviews确保您的应用程序没有这个问题。

  • 单一login 。 一旦用户使用系统Web视图login,Cookie将被放置在浏览器中,并且该帐户可用于任何应用程序,从而防止用户需要单独login每个应用程序。

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

  • 更好的控制。 用户可以select提供应用程序的帐户,或者在支持的情况下在系统Web视图中添加全新的帐户。

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

系统Web视图需要返回到您的应用程序

您阅读上述内容时可能遇到的一个问题是:

如果应用程序现在调用System Webview进行login,并且无法控制它,那么如何从System Webview中获取我需要的令牌?

答案是您必须利用每个操作系统callback应用程序的机制,然后使用OAuth2协议中的redirectURI将响应返回给使用该机制的应用程序。 这几乎就像这样在Web浏览器中工作。 您将从网站redirect到身份提供程序进行login,然后身份提供程序使用redirectURI将响应中某个位置的用户返回到网站。

对于通过自定义URLscheme完成的iOS。 URLscheme格式为CFBundleURLScheme:\\CFBundleURLSchemes ,定义如下:

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

要为您的应用注册一个URLtypes,请在应用的Info.plist文件中包含CFBundleURLTypes项。 CFBundleURLTypes键包含一个字典数组,每个字典都定义了应用程序支持的URLscheme。

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

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

  1. 找出你的应用程序的URLscheme(例如appauth://abc123
  2. 告诉Azure AD您的新的URLscheme是什么,将它作为另一个redirectURI添加到您的应用程序中。
  3. configuration您的应用程序来监听这个URLscheme并启动应用程序
  4. 一旦这个URLscheme启动你的应用程序(App Auth,以及我们自己的MSAL库,请为你做!),configuration应用程序本身来获取令牌。

1.找出你的应用程序的URLscheme

您可以阅读如何从Apple的应用程序间通信文档制作URLscheme,但我们build议您使用appauth://<client id> (例如: appauth://ab032846-efee-481f-b6bc-493aae92c432

2.告诉Azure AD你的新的URLscheme是什么

您需要将此URLscheme作为RedirectURI添加到您的应用中。 这很容易做到。 只需访问https://apps.dev.microsoft.com/并select您的应用程序&#x3002; 向下滚动到Native Applications程序下的自定义应用程序URI,并添加您的新的redirectURI!

开发人员门户中需要输入此信息的地点快照

3.configuration您的应用程序以侦听此URLscheme

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

  <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> 

4.configuration应用程序本身来获取令牌

尽pipe从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; } 

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

而已!

您的应用程序现在应该可以使用Azure Active Directory。 系统Web视图的这种模式在很多身份提供商(微软,Google,Facebook)和移动平台上都很常见。

奖金内容

正如我上面所说,微软是一个OpenID工作组的贡献者,并支持App Auth开发。 因此,这里是一个拉动请求,并应该帮助你解决这里的任何问题: https : //github.com/brandwe/AppAuth-iOS/tree/dev/Examples

它目前有一个使用/ common端点的问题,但否则上面提到的所有解决scheme都代表那里的代码!

用这个修改Web.config帮助:

 <system.webServer> <rewrite> <rules> <rule name="Redirect to https"> <match url="(.*)"/> <conditions> <add input="{HTTPS}" pattern="Off"/> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/> </rule> </rules> </rewrite> </system.webServer> 

恐怕我不能回答这个问题,但我可以build议,在我自己的调查之后,这不是一个redirect的URI问题。 我也可以build议,它是在login.live.com和login.microsoftonline.com(live works和microsoftonline.com没有)之间的区别,但也login.microsoftonline.com确实工作在Windows环境,但不是一个IOS一