Add authentication to your iOS app(将身份验证添加到 iOS 应用)

本教程介绍如何使用支持的标识提供者向 iOS 快速入门项目添加身份验证。本教程基于 iOS quick start(iOS 快速入门)教程,必须先完成该教程。

注册应用以进行身份验证并配置应用服务

首先,需要在标识提供者网站上注册应用,然后在移动应用后端设置提供者生成的凭据。

  1. 请按照以下提供者特定的说明来配置首选标识提供者:

  2. 为要在应用中支持的各提供者重复上述步骤。

将应用添加到允许的外部重定向 URL

安全身份验证要求为应用定义新的 URL 方案。此方案允许在完成身份验证过程后,身份验证系统重定向到应用。在本教程中,我们自始至终使用 URL 方案 appname。但是,可以使用任何你所选的 URL 方案。该方案是移动应用的唯一方案。在服务器端启用重定向:

  1. Azure 门户中,选择你的应用服务。

  2. 单击“身份验证/授权”菜单选项。

  3. 在“身份验证提供程序”下面,单击“Azure Active Directory”。

  4. 将“管理模式”设为“高级”。

  5. 在“允许的外部重定向 URL”中,输入 appname://easyauth.callback。此字符串中的 appname 是移动应用的 URL 方案。此方案应遵循协议的一般 URL 规范(只使用字母和数字,并以字母开头)。你应记下此字符串,因为在一些地方需要使用此 URL 方案调整移动应用代码。

  6. 单击“确定”。

  7. 单击“保存”。

将权限限制给已经过身份验证的用户

默认情况下,可匿名调用移动应用后端中的 API。 接下来,需限制为仅可访问已验证的客户端。

  • Node.js 后端(通过 Azure 门户)

    在移动应用设置中,单击“简易表”并选择相应的表。 单击“更改权限”,为所有权限选择“仅限已验证的访问”,然后单击“保存”。

  • .NET 后端 (C#):

    在服务器项目中,导航到“控制器” > “TodoItemController.cs”。 将 [Authorize] 属性添加到“TodoItemController”类,如下所示。 若要限制为仅可访问特定方法,还可只向这些方法应用此属性(而非类)。 重新发布服务器项目。

    [Authorize]
    public class TodoItemController : TableController<TodoItem>
    
  • Node.js 后端(通过 Node.js 代码)

    若要访问表时需验证身份,请向 Node.js 服务器脚本添加以下行:

    table.access = 'authenticated';
    

    有关更多详细信息,请参阅如何:要求在访问表时进行身份验证。 若要了解如何从网站下载快速入门代码项目,请参阅如何:使用 Git 下载 Node.js 后端快速入门代码项目

在 Xcode 中,按“运行”启动应用。此时出现异常,原因是应用尝试以未经身份验证的用户身份访问后端,但 TodoItem 表现在要求进行身份验证。

向应用程序添加身份验证

Objective-C

  1. 在 Mac 的 Xcode 中打开 QSTodoListViewController.m 并添加以下方法:

    - (void)loginAndGetData
    {
        QSAppDelegate *appDelegate = (QSAppDelegate *)[UIApplication sharedApplication].delegate;
        appDelegate.qsTodoService = self.todoService;
    
        [self.todoService.client loginWithProvider:@"microsoftaccount" urlScheme:@"appname" controller:self animated:YES completion:^(MSUser * _Nullable user, NSError * _Nullable error) {
            if (error) {
                NSLog(@"Login failed with error: %@, %@", error, [error userInfo]);
            }
            else {
                self.todoService.client.currentUser = user;
                NSLog(@"User logged in: %@", user.userId);
    
                [self refresh];
            }
        }];
    }
    

    若未使用 microsoftaccount 作为标识提供者,请将 microsoftaccount 更改为 windowsazureactivedirectory

    urlScheme 替换为应用的唯一名称。urlScheme 应与在 Azure 门户中的“允许的外部重定向 URL”字段中指定的 URL 方案协议相同。身份验证回调使用 urlScheme 在完成身份验证请求之后切换回到你的应用。

  2. 使用以下代码替换 QSTodoListViewController.mviewDidLoad 中的 [self refresh]

    [self loginAndGetData];
    
  3. 打开 QSAppDelegate.h 文件,并添加以下代码:

    #import "QSTodoService.h"
    
    @property (strong, nonatomic) QSTodoService *qsTodoService;
    
  4. 打开 QSAppDelegate.m 文件,并添加以下代码:

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
    {
        if ([[url.scheme lowercaseString] isEqualToString:@"appname"]) {
            // Resume login flow
            return [self.qsTodoService.client resumeWithURL:url];
        }
        else {
            return NO;
        }
    }
    

    在行读取 #pragma mark - Core Data stack 之前直接添加此代码。将 appname 替换为步骤 1 中使用的 urlScheme 值。

  5. 打开 AppName-Info.plist 文件(将 AppName 替换为应用的名称),并添加以下代码:

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.microsoft.azure.zumo</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>appname</string>
            </array>
        </dict>
    </array>
    

    此代码应放置在 <dict> 元素内部。将 appname 字符串(位于 CFBundleURLSchemes 的数组里面)替换为步骤 1 中选择的应用名称。你还可以在 plist 编辑器中进行这些更改 - 在 XCode 中单击 AppName-Info.plist 文件可打开 plist 编辑器。

    CFBundleURLNamecom.microsoft.azure.zumo 字符串替换为你的 Apple 包标识符。

  6. 若要启动该应用程序,请按“运行”,然后再登录。当你登录时,你应能够查看 Todo 列表并进行更新。

Swift

  1. 在 Mac 的 Xcode 中打开 ToDoTableViewController.swift 并添加以下方法:

    func loginAndGetData() {
    
        guard let client = self.table?.client, client.currentUser == nil else {
            return
        }
    
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.todoTableViewController = self
    
        let loginBlock: MSClientLoginBlock = {(user, error) -> Void in
            if (error != nil) {
                print("Error: (error?.localizedDescription)")
            }
            else {
                client.currentUser = user
                print("User logged in: (user?.userId)")
            }
        }
    
        client.login(withProvider:"microsoftaccount", urlScheme: "appname", controller: self, animated: true, completion: loginBlock)
    
    }
    

    若未使用 microsoftaccount 作为标识提供者,请将 microsoftaccount 更改为 windowsazureactivedirectory

    urlScheme 替换为应用的唯一名称。urlScheme 应与在 Azure 门户中的“允许的外部重定向 URL”字段中指定的 URL 方案协议相同。身份验证回调使用 urlScheme 在完成身份验证请求之后切换回到你的应用。

  2. 删除 ToDoTableViewController.swiftviewDidLoad() 末尾的 self.refreshControl?.beginRefreshing()self.onRefresh(self.refreshControl) 行。在其位置上添加对 loginAndGetData() 的调用:

    loginAndGetData()
    
  3. 打开 AppDelegate.swift 文件,并将以下行添加到 AppDelegate 类:

    var todoTableViewController: ToDoTableViewController?
    
    func application(_ application: UIApplication, openURL url: NSURL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.scheme?.lowercased() == "appname" {
            return (todoTableViewController!.table?.client.resume(with: url as URL))!
        }
        else {
            return false
        }
    }
    

    appname 替换为步骤 1 中使用的 urlScheme 值。

  4. 打开 AppName-Info.plist 文件(将 AppName 替换为应用的名称),并添加以下代码:

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.microsoft.azure.zumo</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>appname</string>
            </array>
        </dict>
    </array>
    

    此代码应放置在 <dict> 元素内部。将 appname 字符串(位于 CFBundleURLSchemes 的数组里面)替换为步骤 1 中选择的应用名称。你还可以在 plist 编辑器中进行这些更改 - 在 XCode 中单击 AppName-Info.plist 文件可打开 plist 编辑器。

    CFBundleURLNamecom.microsoft.azure.zumo 字符串替换为你的 Apple 包标识符。

  5. 若要启动该应用程序,请按“运行”,然后再登录。当你登录时,你应能够查看 Todo 列表并进行更新。

应用服务身份验证使用 Apple 应用间通信。有关此主题的更多详细信息,请参阅 Apple 文档