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:
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:
- Podczas logowania Xamarin.Forms aplikacja kontaktuje się z usługą aplikacja systemu Azure w celu zainicjowania przepływu uwierzytelniania.
- 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.
- Aplikacja Xamarin.Forms używa tokenu dostępu do żądania tokenu zasobu z brokera tokenu zasobów.
- 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.
- 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:
- 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).
- 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).
- Utwórz aplikację serwisu Facebook w celu przeprowadzenia uwierzytelniania. Aby uzyskać więcej informacji, zobacz Facebook App Configuration.
- 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).
- 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:
- Utwórz konto usługi Azure Cosmos DB. Aby uzyskać więcej informacji, zobacz Tworzenie konta usługi Azure Cosmos DB.
- 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:
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.
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 przypadkuUserItems
).hostUrl
— wartość powinna być adresem URL aplikacji internetowej w bloku Przegląd konta usługi App Service.
Poniższy zrzut ekranu przedstawia tę konfigurację:
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:
- Utwórz aplikację serwisu Facebook. Aby uzyskać więcej informacji, zobacz Rejestrowanie i konfigurowanie aplikacji w Centrum deweloperów serwisu Facebook.
- 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.
- 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ę:
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:
W witrynie Azure Portal przejdź do aplikacji internetowej usługi App Service.
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ę:
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:
- Xamarin.Forms Otwórz rozwiązanie.
- 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 przypadkuUserItems
).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 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.
Linki powiązane
- Korzystanie z bazy danych dokumentów usługi Azure Cosmos DB
- Securing access to Azure Cosmos DB data (Zabezpieczanie dostępu do danych usługi Azure Cosmos DB)
- Kontrola dostępu w usłudze Azure Cosmos DB for NoSQL.
- Jak partycjonować i skalować w usłudze Azure Cosmos DB
- Biblioteka klienta usługi Azure Cosmos DB
- Azure Cosmos DB API