共用方式為


將驗證新增至 Xamarin.Android 應用程式

概觀

本主題說明如何從用戶端應用程式驗證行動應用程式的使用者。 在本教學課程中,您會使用 Azure Mobile Apps 支援的識別提供者,將驗證新增至快速入門專案。 在行動裝置應用程式中成功驗證和授權之後,會顯示使用者標識碼值。

本教學課程是以行動應用程式快速入門為基礎。 您也必須先完成 建立 Xamarin.Android 應用程式教學課程。 如果您未使用下載的快速入門伺服器專案,您必須將驗證延伸模組套件新增至您的專案。 如需有關伺服器擴充套件的更多資訊,請參閱 使用適用於 Azure 行動應用的 .NET 後台伺服器 SDK

註冊您的應用程式以進行驗證並設定App Services

首先,您必須在身分提供者的網站註冊您的應用程式,然後在行動應用程式的後端設定提供者產生的認證。

  1. 按照提供商的特定指示來設定您的首選身分驗證提供者:

  2. 針對您想要在應用程式中支援的每個提供者重複上述步驟。

將您的應用程式新增至允許的外部重新導向URL

安全驗證需要您為應用程式定義新的 URL 配置。 這可讓驗證系統在驗證程式完成之後重新導向回您的應用程式。 在本教學課程中,我們會在整個過程中使用 URL scheme appname。 不過,您可以使用您選擇的任何 URL 配置。 它應該是您的行動應用程式所特有的。 若要在伺服器端開啟重新導向:

  1. 在 [Azure 入口網站]中,選取您的 App Service。

  2. 按一下 [驗證/授權] 選單選項。

  3. 在 [允許的外部重新導向 URL中,輸入 url_scheme_of_your_app://easyauth.callback。 此字串中的 url_scheme_of_your_app 是行動應用程式的URL配置。 它應該遵循通訊協定的一般 URL 規格(只使用字母和數位,並以字母開頭)。 您應該記下您選擇的字串,因為您需要在數個地方使用URL配置來調整行動應用程式程式代碼。

  4. 按一下 [確定]

  5. 點選 [儲存]。

限制已驗證用戶的許可權

根據預設,Mobile Apps 後端中的 API 可以匿名叫用。 接下來,您必須限制僅對已驗證用戶端的存取。

  • Node.js 後端 (透過 Azure 入口網站)

    在Mobile Apps 設定中,按兩下 [[簡易數據表],然後選取您的數據表。 按一下 [變更許可權],針對所有許可權選取 [僅限已驗證存取 ],然後按一下 [儲存]。

  • .NET 後端 (C#)

    在伺服器專案中,流覽至 Controllers>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登入進行驗證。 對話框可用來在驗證之後顯示使用者標識碼。

    備註

    如果您使用 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 中,在裝置或模擬器上執行客戶端專案,並使用您選擇的識別提供者登入。 成功登入時,應用程式會顯示您的登入標識碼和 todo 專案清單,而且您可以更新數據。

故障排除

應用程式Java.Lang.NoSuchMethodError: No static method startActivity 當機

在某些情況下,支援套件中的衝突只會在Visual Studio中顯示為警告,但應用程式會在運行時間當機,並出現此例外狀況。 在此情況下,您必須確定項目中參考的所有支援套件都有相同的版本。 Azure Mobile Apps NuGet 套件 具有 Android 平臺 Xamarin.Android.Support.CustomTabs 相依性,因此如果您的專案使用較新的支援套件,您需要直接使用必要的版本安裝此套件,以避免衝突。