将身份验证添加到 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 an authenticated user.
     private MobileServiceUser user;
     private async Task<bool> Authenticate()
     {
             var success = false;
             try
             {
                 // Sign in with Facebook login using a server-managed flow.
                 user = await client.LoginAsync(this,
                     MobileServiceAuthenticationProvider.Facebook, "{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();
         }
     }
    
     public override void OnResume()
     {
         base.OnResume();
         Xamarin.Essentials.Platform.OnResume();
     }
    

    这会创建一个新方法,用于对新 登录 按钮的用户和方法处理程序进行身份验证。 上面的示例代码中的用户使用 Facebook 登录名进行身份验证。 对话框用于在经过身份验证后显示用户 ID。

    注释

    如果使用 Facebook 以外的标识提供者,请将上面传递给 LoginAsync 的值更改为以下值之一: MicrosoftAccountTwitterGoogleWindowsAzureActiveDirectory

  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 文件,在 XML 元素中添加 <application> 以下代码:

     <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 和待办事项列表,并且可以对数据进行更新。

故障排除

应用程序崩溃 Java.Lang.NoSuchMethodError: No static method startActivity

在某些情况下,支持包中的冲突在 Visual Studio 中仅显示为警告,但应用程序在运行中会因这个异常而崩溃。 在这种情况下,需要确保项目中引用的所有支持包具有相同的版本。 Azure 移动应用 NuGet 包具有 Xamarin.Android.Support.CustomTabs Android 平台的依赖项,因此,如果你的项目使用较新的支持包,则需要直接安装具有所需版本的此包以避免冲突。