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


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

Обзор

В этом разделе показано, как добавить облачную проверку подлинности в мобильное приложение. В этом руководстве вы добавляете аутентификацию в проект быстрого начала работы с универсальной платформой Windows (UWP) для мобильных приложений с помощью поставщика идентификации, поддерживаемого службой приложений 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. Нажмите кнопку Сохранить.

Ограничение разрешений для пользователей, прошедших проверку подлинности

По умолчанию 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.

Теперь можно убедиться, что анонимный доступ к серверной части отключен. С помощью проекта приложения UWP, установленного в качестве начального проекта, разверните и запустите приложение; Убедитесь, что необработанное исключение с кодом состояния 401 (несанкционированное) возникает после запуска приложения. Это происходит из-за того, что приложение пытается получить доступ к коду мобильного приложения в качестве пользователя без проверки подлинности, но теперь для таблице TodoItem требуется проверка подлинности.

Затем вы обновите приложение для проверки подлинности пользователей перед запросом ресурсов из службы приложений.

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

  1. Откройте файл проекта приложения UWP MainPage.xaml.cs и добавьте следующий фрагмент кода:

     // Define a member variable for storing the signed-in user. 
     private MobileServiceUser user;
    
     // Define a method that performs the authentication process
     // using a Facebook sign-in. 
     private async System.Threading.Tasks.Task<bool> AuthenticateAsync()
     {
         string message;
         bool success = false;
         try
         {
             // Change 'MobileService' to the name of your MobileServiceClient instance.
             // Sign-in using Facebook authentication.
             user = await App.MobileService
                 .LoginAsync(MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}");
             message =
                 string.Format("You are now signed in - {0}", user.UserId);
    
             success = true;
         }
         catch (InvalidOperationException)
         {
             message = "You must log in. Login Required";
         }
    
         var dialog = new MessageDialog(message);
         dialog.Commands.Add(new UICommand("OK"));
         await dialog.ShowAsync();
         return success;
     }
    

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

  2. Замените метод OnNavigatedTo() в MainPage.xaml.cs. Затем вы добавите кнопку входа в приложение, которое активирует проверку подлинности.

     protected override async void OnNavigatedTo(NavigationEventArgs e)
     {
         if (e.Parameter is Uri)
         {
             App.MobileService.ResumeWithURL(e.Parameter as Uri);
         }
     }
    
  3. Добавьте следующий фрагмент кода в MainPage.xaml.cs:

     private async void ButtonLogin_Click(object sender, RoutedEventArgs e)
     {
         // Login the user and then load data from the mobile app.
         if (await AuthenticateAsync())
         {
             // Switch the buttons and load items from the mobile app.
             ButtonLogin.Visibility = Visibility.Collapsed;
             ButtonSave.Visibility = Visibility.Visible;
             //await InitLocalStoreAsync(); //offline sync support.
             await RefreshTodoItems();
         }
     }
    
  4. Откройте файл проекта MainPage.xaml, найдите элемент, который определяет кнопку "Сохранить" и замените его следующим кодом:

     <Button Name="ButtonSave" Visibility="Collapsed" Margin="0,8,8,0" 
             Click="ButtonSave_Click">
         <StackPanel Orientation="Horizontal">
             <SymbolIcon Symbol="Add"/>
             <TextBlock Margin="5">Save</TextBlock>
         </StackPanel>
     </Button>
     <Button Name="ButtonLogin" Visibility="Visible" Margin="0,8,8,0" 
             Click="ButtonLogin_Click" TabIndex="0">
         <StackPanel Orientation="Horizontal">
             <SymbolIcon Symbol="Permissions"/>
             <TextBlock Margin="5">Sign in</TextBlock> 
         </StackPanel>
     </Button>
    
  5. Добавьте следующий фрагмент кода в App.xaml.cs:

     protected override void OnActivated(IActivatedEventArgs args)
     {
         if (args.Kind == ActivationKind.Protocol)
         {
             ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs;
             Frame content = Window.Current.Content as Frame;
             if (content.Content.GetType() == typeof(MainPage))
             {
                 content.Navigate(typeof(MainPage), protocolArgs.Uri);
             }
         }
         Window.Current.Activate();
         base.OnActivated(args);
     }
    
  6. Откройте файл Package.appxmanifest, перейдите к объявлениям, в раскрывающемся списке доступных объявлений выберите протокол и нажмите кнопку "Добавить". Настройте свойства объявления протокола. В отображаемое имядобавьте имя, которое вы хотите отобразить пользователям приложения. В nameдобавьте {url_scheme_of_your_app}.

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

Храните маркер проверки подлинности на клиенте

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

Примечание.

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

  1. В файле проекта MainPage.xaml.cs добавьте следующие директивы using:

     using System.Linq;        
     using Windows.Security.Credentials;
    
  2. Замените метод AuthenticateAsync следующим кодом:

     private async System.Threading.Tasks.Task<bool> AuthenticateAsync()
     {
         string message;
         bool success = false;
    
         // This sample uses the Facebook provider.
         var provider = MobileServiceAuthenticationProvider.Facebook;
    
         // Use the PasswordVault to securely store and access credentials.
         PasswordVault vault = new PasswordVault();
         PasswordCredential credential = null;
    
         try
         {
             // Try to get an existing credential from the vault.
             credential = vault.FindAllByResource(provider.ToString()).FirstOrDefault();
         }
         catch (Exception)
         {
             // When there is no matching resource an error occurs, which we ignore.
         }
    
         if (credential != null)
         {
             // Create a user from the stored credentials.
             user = new MobileServiceUser(credential.UserName);
             credential.RetrievePassword();
             user.MobileServiceAuthenticationToken = credential.Password;
    
             // Set the user from the stored credentials.
             App.MobileService.CurrentUser = user;
    
             // Consider adding a check to determine if the token is 
             // expired, as shown in this post: https://aka.ms/jww5vp.
    
             success = true;
             message = string.Format("Cached credentials for user - {0}", user.UserId);
         }
         else
         {
             try
             {
                 // Sign in with the identity provider.
                 user = await App.MobileService
                     .LoginAsync(provider, "{url_scheme_of_your_app}");
    
                 // Create and store the user credentials.
                 credential = new PasswordCredential(provider.ToString(),
                     user.UserId, user.MobileServiceAuthenticationToken);
                 vault.Add(credential);
    
                 success = true;
                 message = string.Format("You are now signed in - {0}", user.UserId);
             }
             catch (MobileServiceInvalidOperationException)
             {
                 message = "You must sign in. Sign-In Required";
             }
         }
    
         var dialog = new MessageDialog(message);
         dialog.Commands.Add(new UICommand("OK"));
         await dialog.ShowAsync();
    
         return success;
     }
    

    В этой версии AuthenticateAsyncприложение пытается использовать учетные данные, хранящиеся в PasswordVault для доступа к службе. Обычный вход также выполняется при отсутствии сохраненных учетных данных.

    Примечание.

    Кэшированный токен может быть просрочен, и истечение срока его действия также может произойти после успешной проверки подлинности в процессе использования приложения. Сведения о том, как определить, истек ли срок действия маркера, см. в статье Проверка наличия маркеров проверки подлинности с истекшим сроком действия. Решение для обработки ошибок авторизации, связанных с истекающими токенами, см. в записи по кэшированию и обработке просроченных токенов в управляемом пакете SDK для мобильных служб Azure.

  3. Перезапустите приложение дважды.

    Обратите внимание, что при первом запуске необходимо снова войти в систему через поставщика. Однако во втором перезапуске используются кэшированные учетные данные и выполняется обход входа.

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

Теперь, когда вы выполнили это базовое руководство по проверке подлинности, рассмотрите возможность продолжения работы с одним из следующих руководств:

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