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


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

Обзор

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

Предпосылки

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

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

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

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

  1. Настройте предпочитаемого поставщика удостоверений, следуя инструкциям для конкретного поставщика:

  2. Повторите предыдущие шаги для каждого поставщика, которого вы хотите поддерживать в приложении.

Добавьте своё приложение в список разрешённых URL-адресов для внешнего перенаправления

Для безопасной проверки подлинности необходимо определить новую схему URL-адресов для приложения. Это позволяет системе проверки подлинности перенаправляться обратно в приложение после завершения процесса проверки подлинности. В этом руководстве мы используем URL-схему название приложения на протяжении всего руководства. Однако вы можете использовать любую схему 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):

    В параметрах мобильных приложений нажмите Easy Tables и выберите свою таблицу. Щелкните Изменить разрешения, выберите только проверенный доступ для всех разрешений, а затем нажмите Сохранить.

  • .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. В App.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 в элемент макета buttonPanel после существующей кнопки:

     ```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 , а затем задайте в качестве проекта startUp.

  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 и метод Аутентификации , необходимый интерфейсу 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. Откройте AppDelegate.cs в проекте iOS и добавьте следующие 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 и метод аутентификации , который требуется интерфейсом 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 вашего приложения, и роль на «Нет».

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

Добавление аутентификации в проекты приложений Windows 10, включая телефоны

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

  1. В Visual Studio щелкните правой кнопкой мыши проект UWP , а затем задайте проект startUp.

  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 и метод Аутентификации , который требуется интерфейсом 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. Добавьте следующую строку кода в конструктор для класса MainPage перед вызовом LoadApplication():

     ```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-уведомлений.

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

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