Поделиться через


Добавление проверки подлинности в приложение Xamarin Forms

Обзор

В этом разделе показано, как выполнить проверку подлинности пользователей мобильного приложения службы приложений из клиентского приложения. В этом руководстве вы добавите проверку подлинности в проект быстрого запуска Xamarin Forms, используя поставщик удостоверений, поддерживаемый службой приложений. После успешной проверки подлинности и авторизации мобильным приложением отображается значение идентификатора пользователя, и вы сможете получить доступ к ограниченным табличным данным.

Обязательные условия

Для продуктивной работы с этим руководством мы рекомендуем сначала изучить руководство Создание приложения Xamarin.Forms. Завершив работу, вы получите проект Xamarin Forms — кроссплатформенное приложение TodoList.

Если вы не используете скачанный проект быстрого запуска сервера, в проект необходимо добавить пакет расширений для аутентификации. Дополнительные сведения о пакетах расширений для сервера см. в статье Работа с пакетом SDK для внутреннего сервера .NET для мобильных приложений Azure.

Регистрация приложения для проверки подлинности и настройка служб приложений

Сначала необходимо зарегистрировать приложение на сайте поставщика удостоверений, а затем ввести созданные поставщиком учетные данные в серверной части мобильного приложения.

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

    В параметрах мобильных приложений щелкните простые таблицы и выберите таблицу. Щелкните Изменить разрешения, выберите для всех разрешений параметр Authenticated access only (Доступ только с проверкой подлинности) и нажмите кнопку Сохранить.

  • Серверная часть .NET (C#):

    В серверном проекте перейдите к контроллерам>TodoItemController. CS. Примените атрибут [Authorize] к классу TodoItemController следующим образом. Чтобы предоставить доступ только определенным методам, этот атрибут можно также применить именно к ним, а не к классу. Повторная публикация серверного проекта

      [Authorize]
      public class TodoItemController : TableController<TodoItem>
    
  • Серверная служба Node.js (через код Node.js) :

    Чтобы доступ к таблице предоставлялся только после проверки подлинности, добавьте в серверный скрипт Node.js следующую строку:

      table.access = 'authenticated';
    

    Дополнительные сведения см. в разделе Практическое руководство. Обязательная аутентификация для доступа к таблицам. Узнайте, как загрузить проект быстрого запуска кода с веб-узла, в разделе Загрузка серверной части на основе Node.js в виде готового кода для быстрого запуска с помощью Git.

Добавление проверки подлинности в переносимую библиотеку классов

В мобильных приложениях используется метод расширения LoginAsync в MobileServiceClient для входа пользователя в систему с аутентификацией в службе приложений. В этом примере используется управляемый сервером поток проверки подлинности, который отображает интерфейс входа поставщика в приложение. Дополнительные сведения см. в статье Управляемая сервером проверка подлинности. Чтобы пользователям было удобнее работать с вашим рабочим приложением, попробуйте использовать управляемую клиентом аутентификацию.

Чтобы пройти проверку подлинности в проекте Xamarin Forms, следует определить интерфейс IAuthenticate в переносимой библиотеке классов для приложения. Затем добавьте в пользовательский интерфейс, указанный в переносимой библиотеке классов, кнопку Вход, которую пользователь нажимает для выполнения проверки подлинности. После успешной проверки подлинности данные загружаются из серверной части мобильного приложения.

Реализуйте интерфейс IAuthenticate для каждой платформы, поддерживаемой приложением.

  1. в Visual Studio или Xamarin Studio откройте приложение App. cs из проекта с переносимым именем в виде переносимого проекта библиотеки классов, а затем добавьте следующую using инструкцию:

     ```csharp
     using System.Threading.Tasks;
     ```
    
  2. В файл Appp.cs добавьте следующее определение интерфейса IAuthenticate непосредственно перед определением класса App.

     ```csharp
     public interface IAuthenticate
     {
         Task<bool> Authenticate();
     }
     ```
    
  3. Чтобы инициализировать интерфейс с реализацией, относящейся к конкретной платформе, добавьте приведенные ниже статические элементы в класс App.

     ```csharp
     public static IAuthenticate Authenticator { get; private set; }
    
     public static void Init(IAuthenticate authenticator)
     {
         Authenticator = authenticator;
     }
     ```
    
  4. Откройте файл TodoList.xaml в проекте переносимой библиотеки классов и добавьте следующий элемент Button к элементу макета buttonsPanel после имеющейся кнопки:

     ```xml
       <Button x:Name="loginButton" Text="Sign-in" MinimumHeightRequest="30"
         Clicked="loginButton_Clicked"/>
     ```
    

    Эта кнопка запускает управляемую сервером проверку подлинности с помощью серверной части мобильного приложения.

  5. Откройте файл TodoList.xaml.cs в проекте переносимой библиотеки классов и добавьте в класс TodoList следующее поле:

     ```csharp
     // Track whether the user has authenticated.
     bool authenticated = false;
     ```
    
  6. Замените метод OnAppearing следующим кодом:

     ```csharp
     protected override async void OnAppearing()
     {
         base.OnAppearing();
    
         // Refresh items only when authenticated.
         if (authenticated == true)
         {
             // Set syncItems to true in order to synchronize the data
             // on startup when running in offline mode.
             await RefreshItems(true, syncItems: false);
    
             // Hide the Sign-in button.
             this.loginButton.IsVisible = false;
         }
     }
     ```
    

    Это гарантирует, что данные будут обновляться из службы только после проверки подлинности пользователя.

  7. Добавьте следующий обработчик событий Clicked в класс TodoList:

     ```csharp
     async void loginButton_Clicked(object sender, EventArgs e)
     {
         if (App.Authenticator != null)
             authenticated = await App.Authenticator.Authenticate();
    
         // Set syncItems to true to synchronize the data on startup when offline is enabled.
         if (authenticated == true)
             await RefreshItems(true, syncItems: false);
     }
     ```
    
  8. Сохраните изменения и создайте проект переносимой библиотеки классов, убедившись в отсутствии ошибок.

Добавление проверки подлинности в приложение Android

В этом разделе показано, как реализовать интерфейс IAuthenticate в проекте приложения Android. Пропустите этот раздел, если вы не пользуетесь устройствами Android.

  1. В Visual Studio или Xamarin Studio щелкните правой кнопкой мыши проект droid и выберите пункт Назначить запускаемым проектом.

  2. Нажмите клавишу F5, чтобы запустить проект в отладчике. После запуска приложения должно появиться необработанное исключение с кодом состояния 401 ("Не санкционировано"). Код 401 создается потому, что доступ на серверной стороне предоставлен только авторизованным пользователям.

  3. Откройте файл MainActivity.cs в проекте Android и добавьте следующие операторы using :

     ```csharp
     using Microsoft.WindowsAzure.MobileServices;
     using System.Threading.Tasks;
     ```
    
  4. Обновите класс MainActivity, как показано ниже, чтобы реализовать интерфейс IAuthenticate.

     ```csharp
     public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity, IAuthenticate
     ```
    
  5. Обновите класс MainActivity, добавив поле MobileServiceUser и метод Authenticate, который необходим для интерфейса IAuthenticate, как показано ниже.

     ```csharp
     // Define an authenticated user.
     private MobileServiceUser user;
    
     public async Task<bool> Authenticate()
     {
         var success = false;
         var message = string.Empty;
         try
         {
             // Sign in with Facebook login using a server-managed flow.
             user = await TodoItemManager.DefaultManager.CurrentClient.LoginAsync(this, 
                 MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}");
             if (user != null)
             {
                 message = string.Format("you are now signed-in as {0}.",
                     user.UserId);
                 success = true;
             }
         }
         catch (Exception ex)
         {
             message = ex.Message;
         }
    
         // Display the success or failure message.
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
         builder.SetMessage(message);
         builder.SetTitle("Sign-in result");
         builder.Create().Show();
    
         return success;
     }
    
     public override void OnResume()
     {
         base.OnResume();
         Xamarin.Essentials.Platform.OnResume();
     }
     ```
    

    Если используется поставщик удостоверений, отличный от Facebook, выберите другое значение MobileServiceAuthenticationProvider.

  6. Обновите файл 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>
    

    Замените имя репозитория {url_scheme_of_your_app} своей схемой URL-адреса.

  7. Добавьте следующий код в метод OnCreate в классе MainActivity перед вызовом метода LoadApplication():

     ```csharp
     // Initialize the authenticator before loading the app.
     App.Init((IAuthenticate)this);
     ```
    

    Этот код гарантирует, что структура проверки подлинности инициализируется перед загрузкой приложения.

  8. Повторно выполните сборку и запустите приложение. Потом выполните вход, используя выбранный поставщик проверки подлинности, и убедитесь, что у вас есть доступ к данным в качестве прошедшего проверку подлинности пользователя.

Устранение неполадок

Сбой приложения с ошибкой Java.Lang.NoSuchMethodError: No static method startActivity

В некоторых случаях конфликты в пакетах поддержки отображаются в виде обычного предупреждения в Visual Studio, но во время выполнения происходит сбой приложения с этим исключением. В этом случае необходимо убедиться, что у всех пакетов поддержки, на которые содержатся ссылки в проекте, одинаковая версия. Пакет NuGet для мобильных приложений Azure имеет зависимость Xamarin.Android.Support.CustomTabs для платформы Android, поэтому если в проекте используются пакеты поддержки более новой версии, во избежание конфликтов необходимо установить требуемую версию пакета.

Добавление проверки подлинности в приложение iOS

В этом разделе показано, как реализовать интерфейс IAuthenticate в проекте приложения iOS. Пропустите этот раздел, если вы не пользуетесь устройствами iOS.

  1. В Visual Studio или Xamarin Studio щелкните правой кнопкой мыши проект iOS и выберите Назначить запускаемым проектом.

  2. Нажмите клавишу F5, чтобы запустить проект в отладчике. После запуска приложения должно появиться необработанное исключение с кодом состояния 401 ("Не санкционировано"). Ответ 401 создается потому, что доступ на серверной стороне предоставлен только авторизованным пользователям.

  3. Затем в проекте iOS откройте файл AppDelegate.cs и добавьте следующие операторы using :

     ```csharp
     using Microsoft.WindowsAzure.MobileServices;
     using System.Threading.Tasks;
     ```
    
  4. Обновите класс AppDelegate, как показано ниже, чтобы реализовать интерфейс IAuthenticate.

     ```csharp
     public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IAuthenticate
     ```
    
  5. Обновите класс AppDelegate, добавив поле MobileServiceUser и метод Authenticate, который необходим для интерфейса IAuthenticate, как показано ниже.

     ```csharp
     // Define an authenticated user.
     private MobileServiceUser user;
    
     public async Task<bool> Authenticate()
     {
         var success = false;
         var message = string.Empty;
         try
         {
             // Sign in with Facebook login using a server-managed flow.
             if (user == null)
             {
                 user = await TodoItemManager.DefaultManager.CurrentClient
                     .LoginAsync(UIApplication.SharedApplication.KeyWindow.RootViewController,
                     MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}");
                 if (user != null)
                 {
                     message = string.Format("You are now signed-in as {0}.", user.UserId);
                     success = true;
                 }
             }
         }
         catch (Exception ex)
         {
            message = ex.Message;
         }
    
         // Display the success or failure message.
         UIAlertController avAlert = UIAlertController.Create("Sign-in result", message, UIAlertControllerStyle.Alert);
         avAlert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
         UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(avAlert, true, null);
    
         return success;
     }
     ```
    

    Если используется поставщик удостоверений, отличающийся от Facebook, выберите другое значение [MobileServiceAuthenticationProvider].

  6. Обновите класс AppDelegate, добавив перегрузку метода OpenUrl, как показано ниже:

     ```csharp
     public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
     {
         if (TodoItemManager.DefaultManager.CurrentClient.ResumeWithURL(app, url, options))
             return true;
         return base.OpenUrl(app, url, options);
     }
     ```
    
  7. Добавьте следующую строку кода в метод FinishedLaunching перед вызовом LoadApplication():

     ```csharp
     App.Init(this);
     ```
    

    Этот код гарантирует, что структура проверки подлинности инициализируется перед тем, как приложение загрузится.

  8. Откройте Info.plist и добавьте тип URL-адреса. Для параметра Идентификатор задайте имя по своему выбору, для параметра Схемы URL-адресов укажите схему URL-адреса приложения, а для параметра Роль установите значение None.

  9. Повторно выполните сборку и запустите приложение. Потом выполните вход, используя выбранный поставщик проверки подлинности, и убедитесь, что у вас есть доступ к данным в качестве прошедшего проверку подлинности пользователя.

Добавление проверки подлинности в проекты приложений Windows 10 (включая Phone)

В этом разделе показано, как реализовать интерфейс IAuthenticate в проекте приложения Windows 10. Те же действия применяются для проектов универсальной платформы Windows (UWP), но с помощью проекта UWP (с указанными изменениями). Пропустите этот раздел, если вы не пользуетесь устройствами Windows.

  1. В Visual Studio щелкните правой кнопкой мыши проект UWPи выберите пункт Назначить запускаемым проектом.

  2. Нажмите клавишу F5, чтобы запустить проект в отладчике. После запуска приложения должно появиться необработанное исключение с кодом состояния 401 ("Не санкционировано"). Ответ 401 возвращается, так как доступ на серверной стороне предоставлен только авторизованным пользователям.

  3. Затем откройте файл MainPage.xaml.cs проекта приложения Windows и добавьте следующие операторы using :

     ```csharp
     using Microsoft.WindowsAzure.MobileServices;
     using System.Threading.Tasks;
     using Windows.UI.Popups;
     using <your_Portable_Class_Library_namespace>;
     ```
    

    Вместо <your_Portable_Class_Library_namespace> укажите пространство имен для переносимой библиотеки классов.

  4. Обновите класс MainPage, как показано ниже, чтобы реализовать интерфейс IAuthenticate.

     public sealed partial class MainPage : IAuthenticate
    
  5. Обновите класс MainPage, добавив поле MobileServiceUser и метод Authenticate, который необходим для интерфейса IAuthenticate, как показано ниже.

     ```csharp
     // Define an authenticated user.
     private MobileServiceUser user;
    
     public async Task<bool> Authenticate()
     {
         string message = string.Empty;
         var success = false;
    
         try
         {
             // Sign in with Facebook login using a server-managed flow.
             if (user == null)
             {
                 user = await TodoItemManager.DefaultManager.CurrentClient
                     .LoginAsync(MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}");
                 if (user != null)
                 {
                     success = true;
                     message = string.Format("You are now signed-in as {0}.", user.UserId);
                 }
             }
    
         }
         catch (Exception ex)
         {
             message = string.Format("Authentication Failed: {0}", ex.Message);
         }
    
         // Display the success or failure message.
         await new MessageDialog(message, "Sign-in result").ShowAsync();
    
         return success;
     }
     ```
    

    Если используется поставщик удостоверений, отличный от Facebook, выберите другое значение MobileServiceAuthenticationProvider.

  6. Добавьте следующую строку кода в конструктор для класса MainPageLoadApplication() перед вызовом метода :

     ```csharp
     // Initialize the authenticator before loading the app.
     <your_Portable_Class_Library_namespace>.App.Init(this);
     ```
    

    Вместо <your_Portable_Class_Library_namespace> укажите пространство имен для переносимой библиотеки классов.

  7. Если вы используете UWP, добавьте переопределение метода OnActivated в класс App:

     ```csharp
     protected override void OnActivated(IActivatedEventArgs args)
     {
        base.OnActivated(args);
    
         if (args.Kind == ActivationKind.Protocol)
         {
             ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs;
             MobileServiceClientExtensions.ResumeWithURL(TodoItemManager.DefaultManager.CurrentClient,protocolArgs.Uri);
         }
     }
     ```
    
  8. Откройте файл Package.appxmanifest и добавьте объявление протокола. Для параметра Отображаемое имя задайте имя по своему выбору, а для параметра Имя укажите схему URL-адреса приложения.

  9. Повторно выполните сборку и запустите приложение. Потом выполните вход, используя выбранный поставщик проверки подлинности, и убедитесь, что у вас есть доступ к данным в качестве прошедшего проверку подлинности пользователя.

Дальнейшие действия

Вы прошли этот учебник по обычной проверке подлинности и теперь можете перейти к одному из следующих учебников:

  • Добавление push-уведомлений в приложение

    Узнайте, как добавить поддержку push-уведомлений в мобильное приложение и настроить в его серверной части использование концентраторов уведомлений Azure для отправки push-уведомлений.

  • Включение автономной синхронизации для приложения

    Узнайте, как добавить в приложение поддержку автономной работы с помощью серверной части мобильного приложения. Автономная синхронизация позволяет конечным пользователям взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные даже при отсутствии подключения к сети.