Udostępnij za pośrednictwem


Uwierzytelnianie użytkowników za pomocą bazy danych dokumentów usługi Azure Cosmos DB i Xamarin.Forms

Bazy danych dokumentów usługi Azure Cosmos DB obsługują partycjonowane kolekcje, które mogą obejmować wiele serwerów i partycji, jednocześnie obsługując nieograniczony magazyn i przepływność. W tym artykule wyjaśniono, jak połączyć kontrolę dostępu z kolekcjami podzielonymi na partycje, aby użytkownik mógł uzyskiwać dostęp tylko do własnych dokumentów w Xamarin.Forms aplikacji.

Omówienie

Klucz partycji należy określić podczas tworzenia kolekcji partycjonowanej, a dokumenty z tym samym kluczem partycji będą przechowywane w tej samej partycji. W związku z tym określenie tożsamości użytkownika jako klucza partycji spowoduje partycjonowaną kolekcję, która będzie przechowywać tylko dokumenty dla tego użytkownika. Dzięki temu baza danych dokumentów usługi Azure Cosmos DB będzie skalowana wraz ze wzrostem liczby użytkowników i elementów.

Dostęp musi być udzielany dowolnej kolekcji, a model kontroli dostępu usługi Azure Cosmos DB for NoSQL definiuje dwa typy konstrukcji dostępu:

  • Klucze główne umożliwiają pełny dostęp administracyjny do wszystkich zasobów w ramach konta usługi Azure Cosmos DB i są tworzone podczas tworzenia konta usługi Azure Cosmos DB.
  • Tokeny zasobów przechwytują relację między użytkownikiem bazy danych a uprawnieniem, które użytkownik ma dla określonego zasobu usługi Azure Cosmos DB, takiego jak kolekcja lub dokument.

Uwidacznianie klucza głównego powoduje otwarcie konta usługi Azure Cosmos DB na możliwość złośliwego lub nieumyślnego użycia. Jednak tokeny zasobów usługi Azure Cosmos DB zapewniają bezpieczny mechanizm umożliwiający klientom odczytywanie, zapisywanie i usuwanie określonych zasobów na koncie usługi Azure Cosmos DB zgodnie z udzielonymi uprawnieniami.

Typowym podejściem do żądania, generowania i dostarczania tokenów zasobów do aplikacji mobilnej jest użycie brokera tokenów zasobów. Na poniższym diagramie przedstawiono ogólny przegląd sposobu, w jaki przykładowa aplikacja używa brokera tokenów zasobów do zarządzania dostępem do danych bazy danych dokumentów:

Proces uwierzytelniania bazy danych dokumentów

Broker tokenu zasobów to usługa internetowego interfejsu API warstwy średniej hostowana w usłudze aplikacja systemu Azure, która posiada klucz główny konta usługi Azure Cosmos DB. Przykładowa aplikacja używa brokera tokenów zasobów do zarządzania dostępem do danych bazy danych dokumentów w następujący sposób:

  1. Podczas logowania Xamarin.Forms aplikacja kontaktuje się z usługą aplikacja systemu Azure w celu zainicjowania przepływu uwierzytelniania.
  2. usługa aplikacja systemu Azure wykonuje przepływ uwierzytelniania OAuth w serwisie Facebook. Po zakończeniu Xamarin.Forms przepływu uwierzytelniania aplikacja otrzymuje token dostępu.
  3. Aplikacja Xamarin.Forms używa tokenu dostępu do żądania tokenu zasobu z brokera tokenu zasobów.
  4. Broker tokenu zasobów używa tokenu dostępu do żądania tożsamości użytkownika z serwisu Facebook. Tożsamość użytkownika jest następnie używana do żądania tokenu zasobu z usługi Azure Cosmos DB, który służy do udzielania dostępu do odczytu/zapisu do kolekcji podzielonej na partycje uwierzytelnionego użytkownika.
  5. Aplikacja Xamarin.Forms używa tokenu zasobu do bezpośredniego uzyskiwania dostępu do zasobów usługi Azure Cosmos DB z uprawnieniami zdefiniowanymi przez token zasobu.

Uwaga

Po wygaśnięciu tokenu zasobu kolejne żądania bazy danych dokumentów otrzymają wyjątek 401 nieautoryzowany. W tym momencie Xamarin.Forms aplikacje powinny ponownie ustanowić tożsamość i zażądać nowego tokenu zasobu.

Aby uzyskać więcej informacji na temat partycjonowania usługi Azure Cosmos DB, zobacz How to partition and scale in Azure Cosmos DB (Jak partycjonować i skalować w usłudze Azure Cosmos DB). Aby uzyskać więcej informacji na temat kontroli dostępu do usługi Azure Cosmos DB, zobacz Zabezpieczanie dostępu do danych usługi Azure Cosmos DB i kontrola dostępu w usłudze Azure Cosmos DB for NoSQL.

Ustawienia

Proces integrowania brokera tokenów zasobów z aplikacją Xamarin.Forms jest następujący:

  1. Utwórz konto usługi Azure Cosmos DB, które będzie używać kontroli dostępu. Aby uzyskać więcej informacji, zobacz Azure Cosmos DB Configuration (Konfiguracja usługi Azure Cosmos DB).
  2. Utwórz usługę aplikacja systemu Azure do hostowania brokera tokenów zasobów. Aby uzyskać więcej informacji, zobacz aplikacja systemu Azure Service Configuration (Konfiguracja usługi aplikacja systemu Azure).
  3. Utwórz aplikację serwisu Facebook w celu przeprowadzenia uwierzytelniania. Aby uzyskać więcej informacji, zobacz Facebook App Configuration.
  4. Skonfiguruj usługę aplikacja systemu Azure w celu łatwego uwierzytelniania za pomocą serwisu Facebook. Aby uzyskać więcej informacji, zobacz aplikacja systemu Azure Service Authentication Configuration (Konfiguracja uwierzytelniania usługi aplikacja systemu Azure Service).
  5. Skonfiguruj przykładową aplikację do komunikowania Xamarin.Forms się z usługą aplikacja systemu Azure i usługą Azure Cosmos DB. Aby uzyskać więcej informacji, zobacz Xamarin.Forms Application Configuration (Konfiguracja aplikacji).

Uwaga

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Konfiguracja usługi Azure Cosmos DB

Proces tworzenia konta usługi Azure Cosmos DB, które będzie używać kontroli dostępu, jest następujący:

  1. Utwórz konto usługi Azure Cosmos DB. Aby uzyskać więcej informacji, zobacz Tworzenie konta usługi Azure Cosmos DB.
  2. Na koncie usługi Azure Cosmos DB utwórz nową kolekcję o nazwie UserItems, określając klucz partycji ./userid

Konfiguracja usługi aplikacja systemu Azure

Proces hostowania brokera tokenów zasobów w usłudze aplikacja systemu Azure jest następujący:

  1. W witrynie Azure Portal utwórz nową aplikację internetową usługi App Service. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji internetowej w środowisku App Service Environment.

  2. W witrynie Azure Portal otwórz blok App Ustawienia dla aplikacji internetowej i dodaj następujące ustawienia:

    • accountUrl — wartość powinna być adresem URL konta usługi Azure Cosmos DB z bloku Klucze konta usługi Azure Cosmos DB.
    • accountKey — wartość powinna być kluczem głównym usługi Azure Cosmos DB (podstawowym lub pomocniczym) z bloku Klucze konta usługi Azure Cosmos DB.
    • databaseId — wartość powinna być nazwą bazy danych usługi Azure Cosmos DB.
    • collectionId — wartość powinna być nazwą kolekcji usługi Azure Cosmos DB (w tym przypadku UserItems).
    • hostUrl — wartość powinna być adresem URL aplikacji internetowej w bloku Przegląd konta usługi App Service.

    Poniższy zrzut ekranu przedstawia tę konfigurację:

    Ustawienia aplikacji internetowej usługi App Service

  3. Opublikuj rozwiązanie brokera tokenów zasobów w aplikacji internetowej usługi aplikacja systemu Azure Service.

Konfiguracja aplikacji serwisu Facebook

Proces tworzenia aplikacji facebook w celu przeprowadzenia uwierzytelniania jest następujący:

  1. Utwórz aplikację serwisu Facebook. Aby uzyskać więcej informacji, zobacz Rejestrowanie i konfigurowanie aplikacji w Centrum deweloperów serwisu Facebook.
  2. Dodaj produkt Facebook Login do aplikacji. Aby uzyskać więcej informacji, zobacz Dodawanie logowania do serwisu Facebook do aplikacji lub witryny internetowej w Centrum deweloperów Serwisu Facebook.
  3. Skonfiguruj logowanie do serwisu Facebook w następujący sposób:
    • Włącz logowanie OAuth klienta.
    • Włącz logowanie za pomocą protokołu OAuth w sieci Web.
    • Ustaw prawidłowy identyfikator URI przekierowania OAuth na identyfikator URI aplikacji internetowej usługi App Service z dołączonym identyfikatorem /.auth/login/facebook/callback URI.

Poniższy zrzut ekranu przedstawia tę konfigurację:

Logowanie przy użyciu protokołu OAuth w usłudze Facebook Ustawienia

Aby uzyskać więcej informacji, zobacz Rejestrowanie aplikacji w serwisie Facebook.

Konfiguracja uwierzytelniania usługi aplikacja systemu Azure

Proces konfigurowania łatwego uwierzytelniania w usłudze App Service jest następujący:

  1. W witrynie Azure Portal przejdź do aplikacji internetowej usługi App Service.

  2. W witrynie Azure Portal otwórz blok Uwierzytelnianie/autoryzacja i wykonaj następującą konfigurację:

    • Uwierzytelnianie usługi App Service powinno być włączone.
    • Akcja do wykonania, gdy żądanie nie zostało uwierzytelnione, powinna być ustawiona na Wartość Zaloguj się w usłudze Facebook.

    Poniższy zrzut ekranu przedstawia tę konfigurację:

    Ustawienia uwierzytelniania aplikacji internetowej usługi App Service

Aplikacja internetowa usługi App Service powinna być również skonfigurowana do komunikowania się z aplikacją Facebook w celu włączenia przepływu uwierzytelniania. Można to zrobić, wybierając dostawcę tożsamości Facebook i wprowadzając wartości Identyfikator aplikacji i Klucz tajny aplikacji z ustawień aplikacji Facebook w Centrum deweloperów Facebooka. Aby uzyskać więcej informacji, zobacz Dodawanie informacji na Facebooku do aplikacji.

Xamarin.Forms Konfiguracja aplikacji

Proces konfigurowania przykładowej Xamarin.Forms aplikacji jest następujący:

  1. Xamarin.Forms Otwórz rozwiązanie.
  2. Otwórz Constants.cs i zaktualizuj wartości następujących stałych:
    • EndpointUri — wartość powinna być adresem URL konta usługi Azure Cosmos DB z bloku Klucze konta usługi Azure Cosmos DB.
    • DatabaseName — wartość powinna być nazwą bazy danych dokumentów.
    • CollectionName — wartość powinna być nazwą kolekcji bazy danych dokumentów (w tym przypadku UserItems).
    • ResourceTokenBrokerUrl — wartość powinna być adresem URL aplikacji internetowej brokera tokenów zasobów w bloku Przegląd konta usługi App Service.

Inicjowanie logowania

Przykładowa aplikacja inicjuje proces logowania, przekierowując przeglądarkę do adresu URL dostawcy tożsamości, jak pokazano w poniższym przykładowym kodzie:

var auth = new Xamarin.Auth.WebRedirectAuthenticator(
  new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/facebook"),
  new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/done"));

Powoduje to zainicjowanie przepływu uwierzytelniania OAuth między usługą aplikacja systemu Azure a serwisem Facebook, który wyświetla stronę logowania serwisu Facebook:

Logowanie do serwisu Facebook

Logowanie można anulować, naciskając przycisk Anuluj w systemie iOS lub naciskając przycisk Wstecz w systemie Android, w tym przypadku użytkownik pozostaje nieuwierzytelniony, a interfejs użytkownika dostawcy tożsamości zostanie usunięty z ekranu.

Uzyskiwanie tokenu zasobu

Po pomyślnym uwierzytelnieniu WebRedirectAuthenticator.Completed zdarzenie zostanie wyzwolony. W poniższym przykładzie kodu pokazano obsługę tego zdarzenia:

auth.Completed += async (sender, e) =>
{
  if (e.IsAuthenticated && e.Account.Properties.ContainsKey("token"))
  {
    var easyAuthResponseJson = JsonConvert.DeserializeObject<JObject>(e.Account.Properties["token"]);
    var easyAuthToken = easyAuthResponseJson.GetValue("authenticationToken").ToString();

    // Call the ResourceBroker to get the resource token
    using (var httpClient = new HttpClient())
    {
      httpClient.DefaultRequestHeaders.Add("x-zumo-auth", easyAuthToken);
      var response = await httpClient.GetAsync(Constants.ResourceTokenBrokerUrl + "/api/resourcetoken/");
      var jsonString = await response.Content.ReadAsStringAsync();
      var tokenJson = JsonConvert.DeserializeObject<JObject>(jsonString);
      resourceToken = tokenJson.GetValue("token").ToString();
      UserId = tokenJson.GetValue("userid").ToString();

      if (!string.IsNullOrWhiteSpace(resourceToken))
      {
        client = new DocumentClient(new Uri(Constants.EndpointUri), resourceToken);
        ...
      }
      ...
    }
  }
};

Wynikiem pomyślnego uwierzytelnienia jest token dostępu, który jest dostępną AuthenticatorCompletedEventArgs.Account właściwością. Token dostępu jest wyodrębniany i używany w żądaniu GET do interfejsu API brokera resourcetoken tokenów zasobów.

Interfejs resourcetoken API używa tokenu dostępu do żądania tożsamości użytkownika z serwisu Facebook, co z kolei służy do żądania tokenu zasobu z usługi Azure Cosmos DB. Jeśli prawidłowy dokument uprawnień już istnieje dla użytkownika w bazie danych dokumentów, zostanie pobrany i dokument JSON zawierający token zasobu zostanie zwrócony do Xamarin.Forms aplikacji. Jeśli dla użytkownika nie istnieje prawidłowy dokument uprawnień, w bazie danych dokumentów zostanie utworzony użytkownik i uprawnienie, a token zasobu zostanie wyodrębniony z dokumentu uprawnień i zwrócony do Xamarin.Forms aplikacji w dokumencie JSON.

Uwaga

Użytkownik bazy danych dokumentów jest zasobem skojarzonym z bazą danych dokumentów, a każda baza danych może zawierać zero lub więcej użytkowników. Uprawnienie bazy danych dokumentów jest zasobem skojarzonym z użytkownikiem bazy danych dokumentów, a każdy użytkownik może zawierać zero lub więcej uprawnień. Zasób uprawnień zapewnia dostęp do tokenu zabezpieczającego wymaganego przez użytkownika podczas próby uzyskania dostępu do zasobu, takiego jak dokument.

resourcetoken Jeśli interfejs API zostanie pomyślnie ukończony, wyśle kod stanu HTTP 200 (OK) w odpowiedzi wraz z dokumentem JSON zawierającym token zasobu. Następujące dane JSON pokazują typowy komunikat odpowiedzi zakończony powodzeniem:

{
  "id": "John Smithpermission",
  "token": "type=resource&ver=1&sig=zx6k2zzxqktzvuzuku4b7y==;a74aukk99qtwk8v5rxfrfz7ay7zzqfkbfkremrwtaapvavw2mrvia4umbi/7iiwkrrq+buqqrzkaq4pp15y6bki1u//zf7p9x/aefbvqvq3tjjqiffurfx+vexa1xarxkkv9rbua9ypfzr47xpp5vmxuvzbekkwq6txme0xxxbjhzaxbkvzaji+iru3xqjp05amvq1r1q2k+qrarurhmjzah/ha0evixazkve2xk1zu9u/jpyf1xrwbkxqpzebvqwma+hyyaazemr6qx9uz9be==;",
  "expires": 4035948,
  "userid": "John Smith"
}

Procedura WebRedirectAuthenticator.Completed obsługi zdarzeń odczytuje odpowiedź z interfejsu resourcetoken API i wyodrębnia token zasobu i identyfikator użytkownika. Token zasobu jest następnie przekazywany jako argument do DocumentClient konstruktora, który hermetyzuje punkt końcowy, poświadczenia i zasady połączenia używane do uzyskiwania dostępu do usługi Azure Cosmos DB i służy do konfigurowania i wykonywania żądań względem usługi Azure Cosmos DB. Token zasobu jest wysyłany z każdym żądaniem, aby uzyskać bezpośredni dostęp do zasobu i wskazuje, że udzielono dostępu do odczytu/zapisu do kolekcji podzielonej na partycje uwierzytelnionych użytkowników.

Pobieranie dokumentów

Pobieranie dokumentów należących tylko do uwierzytelnionego użytkownika można osiągnąć, tworząc zapytanie dokumentu zawierające identyfikator użytkownika jako klucz partycji i pokazano w poniższym przykładzie kodu:

var query = client.CreateDocumentQuery<TodoItem>(collectionLink,
                        new FeedOptions
                        {
                          MaxItemCount = -1,
                          PartitionKey = new PartitionKey(UserId)
                        })
          .Where(item => !item.Id.Contains("permission"))
          .AsDocumentQuery();
while (query.HasMoreResults)
{
  Items.AddRange(await query.ExecuteNextAsync<TodoItem>());
}

Zapytanie asynchronicznie pobiera wszystkie dokumenty należące do uwierzytelnionego użytkownika, z określonej kolekcji i umieszcza je w List<TodoItem> kolekcji do wyświetlenia.

Metoda CreateDocumentQuery<T> określa Uri argument reprezentujący kolekcję, która ma być odpytywana dla dokumentów i FeedOptions obiektu. Obiekt FeedOptions określa, że nieograniczona liczba elementów może być zwracana przez zapytanie, a identyfikator użytkownika jako klucz partycji. Gwarantuje to, że w wyniku zostaną zwrócone tylko dokumenty w kolekcji partycjonowanej użytkownika.

Uwaga

Należy pamiętać, że dokumenty uprawnień utworzone przez brokera tokenów zasobów są przechowywane w tej samej kolekcji dokumentów co dokumenty utworzone przez aplikację Xamarin.Forms . W związku z tym zapytanie dokumentu zawiera klauzulę Where , która stosuje predykat filtrowania do zapytania względem kolekcji dokumentów. Ta klauzula zapewnia, że dokumenty uprawnień nie są zwracane z kolekcji dokumentów.

Aby uzyskać więcej informacji na temat pobierania dokumentów z kolekcji dokumentów, zobacz Pobieranie dokumentów kolekcji dokumentów.

Wstawianie dokumentów

Przed wstawieniem dokumentu do kolekcji TodoItem.UserId dokumentów należy zaktualizować właściwość o wartości używanej jako klucz partycji, jak pokazano w poniższym przykładzie kodu:

item.UserId = UserId;
await client.CreateDocumentAsync(collectionLink, item);

Dzięki temu dokument zostanie wstawiony do kolekcji partycjonowanej użytkownika.

Aby uzyskać więcej informacji na temat wstawiania dokumentu do kolekcji dokumentów, zobacz Wstawianie dokumentu do kolekcji dokumentów.

Usuwanie dokumentów

Wartość klucza partycji należy określić podczas usuwania dokumentu z kolekcji partycjonowanej, jak pokazano w poniższym przykładzie kodu:

await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(Constants.DatabaseName, Constants.CollectionName, id),
                 new RequestOptions
                 {
                   PartitionKey = new PartitionKey(UserId)
                 });

Dzięki temu usługa Azure Cosmos DB wie, z której kolekcji partycjonowanej ma zostać usunięta.

Aby uzyskać więcej informacji na temat usuwania dokumentu z kolekcji dokumentów, zobacz Usuwanie dokumentu z kolekcji dokumentów.

Podsumowanie

W tym artykule wyjaśniono, jak połączyć kontrolę dostępu z kolekcjami podzielonymi na partycje, aby użytkownik mógł uzyskiwać dostęp tylko do własnych dokumentów bazy danych dokumentów w Xamarin.Forms aplikacji. Określenie tożsamości użytkownika jako klucza partycji gwarantuje, że kolekcja partycjonowana może przechowywać tylko dokumenty dla tego użytkownika.