向 Xamarin.Android 应用添加身份验证

本主题演示如何从客户端应用程序对移动应用的用户进行身份验证。 在本教程中,使用 Azure 移动应用支持的标识提供者向快速入门项目添加身份验证。 在移动应用中成功进行身份验证和授权后,显示用户 ID 值。

本教程基于移动应用快速入门。 还必须先完成教程 创建 Xamarin.Android 应用。 如果不使用下载的快速入门服务器项目,必须将身份验证扩展包添加到项目。 有关服务器扩展包的详细信息,请参阅使用适用于 Azure 移动应用的 .NET 后端服务器 SDK

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

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

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

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

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

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

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

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

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

  4. 单击 “确定”

  5. 单击“保存” 。

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

默认情况下,可匿名调用移动应用后端中的 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 后端快速入门代码项目

在 Visual Studio 或 Xamarin Studio 中,运行设备或模拟器中的客户端项目。 验证在应用启动后是否引发状态代码为 401(“未授权”)的未处理异常。 发生此异常的原因是应用尝试以未经身份验证的用户身份访问移动应用后端。 TodoItem 表现在要求身份验证。

接下来,更新客户端应用,以使用经过身份验证的用户从移动应用后端请求资源。

向应用程序添加身份验证

已更新应用,在显示数据之前要求用户点击“登录” 按钮进行身份验证。

  1. 将以下代码添加到 TodoActivity 类:

    // Define a authenticated user.
    private MobileServiceUser user;
    private async Task<bool> Authenticate()
    {
            var success = false;
            try
            {
                // Sign in with MicrosoftAccount login using a server-managed flow.
                user = await client.LoginAsync(this,
                        MobileServiceAuthenticationProvider.MicrosoftAccount, "{url_scheme_of_your_app}");
                CreateAndShowDialog(string.Format("you are now logged in - {0}",
                    user.UserId), "Logged in!");
    
                success = true;
            }
            catch (Exception ex)
            {
                CreateAndShowDialog(ex, "Authentication failed");
            }
            return success;
    }
    
    [Java.Interop.Export()]
    public async void LoginUser(View view)
    {
        // Load data only after authentication succeeds.
        if (await Authenticate())
        {
            //Hide the button after authentication succeeds.
            FindViewById<Button>(Resource.Id.buttonLoginUser).Visibility = ViewStates.Gone;
    
            // Load the data.
            OnRefreshItemsSelected();
        }
    }
    

    此代码创建一个新方法(用于对用户进行身份验证)和新“登录”按钮的方法处理程序。上面示例代码中的用户使用 MicrosoftAccount 登录进行身份验证。对话框用于在进行身份验证后显示用户 ID。

    Note

    如果使用的标识提供者不是 MicrosoftAccount,请将传递给上述 LoginAsync 的值更改为以下值:WindowsAzureActiveDirectory

  2. OnCreate 方法中,删除或注释掉以下代码行:

    OnRefreshItemsSelected ();
    
  3. 在 Activity_To_Do.axml 文件中,在现有 AddItem 按钮之前添加以下 LoginUser 按钮定义:

      <Button
        android:id="@+id/buttonLoginUser"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="LoginUser"
        android:text="@string/login_button_text" />
    
  4. 将以下元素添加到 Strings.xml 资源文件:

    <string name="login_button_text">Sign in</string>
    
  5. 打开 AndroidManifest.xml 文件,并在 <application> XML 元素中添加以下代码:

     <activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity" android:launchMode="singleTop" android:noHistory="true">
       <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
         <data android:scheme="{url_scheme_of_your_app}" android:host="easyauth.callback" />
       </intent-filter>
     </activity>
    
  6. 在 Visual Studio 或 Xamarin Studio 中,运行设备或模拟器中的客户端项目,并使用所选的标识提供者登录。 成功登录后,应用会显示登录 ID 和待办事项列表,用户可以对数据进行更新。