ověřování uživatelů pomocí Azure Cosmos DB databáze dokumentůXamarin.Forms
Azure Cosmos DB databáze dokumentů podporují dělené kolekce, které můžou zahrnovat víc serverů a oddílů a současně podporují neomezené úložiště a propustnost. Tento článek vysvětluje, jak zkombinovat řízení přístupu pomocí dělených kolekcí, aby uživatel mohl přistupovat jenom k vlastním dokumentům v Xamarin.Forms aplikaci.
Přehled
Při vytváření dělené kolekce se musí zadat klíč oddílu a dokumenty se stejným klíčem oddílu se uloží do stejného oddílu. Proto zadáním identity uživatele jako klíče oddílu navedete do dělené kolekce, která bude ukládat pouze dokumenty pro tohoto uživatele. tím se také zajistí, že se databáze dokumentu Azure Cosmos DB škáluje podle počtu uživatelů a položek.
přístup se musí udělit libovolné kolekci a model řízení přístupu SQL API definuje dva typy konstrukcí přístupu:
- hlavní klíče umožňují úplný přístup správce ke všem prostředkům v rámci účtu Cosmos DB a vytvoří se při vytvoření Cosmos DB účtu.
- tokeny prostředků zaznamenávají vztah mezi uživatelem databáze a oprávnění, které má uživatel pro určitý Cosmos DB prostředek, jako je například kolekce nebo dokument.
vystavení hlavního klíče otevře Cosmos DB účet pro možnost škodlivého nebo nedbalostho použití. Azure Cosmos DB tokeny prostředků ale poskytují bezpečný mechanismus, který klientům umožňuje číst, zapisovat a odstraňovat konkrétní prostředky v účtu Azure Cosmos DB v závislosti na udělených oprávněních.
Typický přístup k vyžádání, generování a doručování tokenů prostředků do mobilní aplikace je použití zprostředkovatele tokenů prostředků. Následující diagram znázorňuje základní přehled o tom, jak ukázková aplikace používá zprostředkovatele tokenů prostředků ke správě přístupu k datům databáze dokumentů:

zprostředkovatel tokenů prostředků je služba webového rozhraní API střední vrstvy, která je hostovaná v Azure App Service, která má hlavní klíč Cosmos DB účtu. Ukázková aplikace používá zprostředkovatele tokenů prostředků ke správě přístupu k datům databáze dokumentů následujícím způsobem:
- Při přihlášení Xamarin.Forms aplikace kontaktuje Azure App Service k zahájení toku ověřování.
- Azure App Service provádí tok ověřování OAuth pomocí Facebooku. Po dokončení toku ověřování Xamarin.Forms obdrží aplikace přístupový token.
- Xamarin.FormsAplikace používá přístupový token k vyžádání tokenu prostředku od zprostředkovatele tokenů prostředků.
- Zprostředkovatel tokenů prostředků používá přístupový token k vyžádání identity uživatele z Facebooku. identita uživatele se pak použije k vyžádání tokenu prostředku z Cosmos DB, který slouží k udělení přístupu pro čtení a zápis do dělené kolekce ověřeného uživatele.
- Xamarin.Formsaplikace používá token prostředku k přímému přístupu k prostředkům Cosmos DB s oprávněními definovanými tokenem prostředku.
Poznámka
Po vypršení platnosti tokenu prostředku obdrží další žádosti o databázi dokumentů 401 neoprávněnou výjimku. V tuto chvíli Xamarin.Forms by aplikace měla znovu vytvořit identitu a požádat o nový token prostředku.
další informace o dělení Cosmos DB najdete v tématu dělení a škálování v Azure Cosmos DB. další informace o Cosmos DB řízení přístupu najdete v tématu zabezpečení přístupu k Cosmos DB dat a řízení přístupu v rozhraní API pro SQL.
Nastavení
Postup pro integraci zprostředkovatele tokenů prostředků do Xamarin.Forms aplikace je následující:
- vytvořte účet Cosmos DB, který bude používat řízení přístupu. další informace najdete v tématu konfigurace Azure Cosmos DB.
- Vytvořte Azure App Service pro hostování zprostředkovatele tokenů prostředků. Další informace najdete v tématu konfigurace Azure App Service.
- Vytvořte aplikaci Facebook, která provede ověření. Další informace najdete v tématu Konfigurace aplikace na Facebooku.
- Nakonfigurujte Azure App Service, aby prováděla jednoduché ověřování pomocí Facebooku. Další informace najdete v tématu Konfigurace ověřování Azure App Service.
- nakonfigurujte Xamarin.Forms ukázkovou aplikaci pro komunikaci s Azure App Service a Cosmos DB. Další informace naleznete v tématu Xamarin.Forms Application Configuration.
Poznámka
Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
konfigurace Azure Cosmos DB
postup vytvoření účtu Cosmos DB, který bude používat řízení přístupu, je následující:
- vytvořte účet Cosmos DB. další informace najdete v tématu vytvoření účtu Azure Cosmos DB.
- v Cosmos DB účtu vytvořte novou kolekci s názvem
UserItemsa zadáním klíče oddílu/userid.
Konfigurace Azure App Service
Proces hostování zprostředkovatele tokenů prostředků v Azure App Service je následující:
V Azure Portal vytvořte novou webovou aplikaci App Service. Další informace najdete v tématu Vytvoření webové aplikace v App Service Environment.
v Azure Portal otevřete okno aplikace Nastavení pro webovou aplikaci a přidejte následující nastavení:
accountUrl– hodnota by měla být Cosmos DB adresa URL účtu z okna klíče účtu Cosmos DB.accountKey– hodnota by měla být hlavní klíč Cosmos DB (primární nebo sekundární) z okna klíče účtu Cosmos DB.databaseId– hodnota by měla být název databáze Cosmos DB.collectionId– hodnota by měla být název kolekce Cosmos DB (v tomto případěUserItems).hostUrl– hodnota by měla být adresa URL webové aplikace z okna Přehled účtu App Service.
Tato konfigurace znázorňuje následující snímek obrazovky:
Publikujte řešení zprostředkovatele tokenů prostředků do webové aplikace Azure App Service.
Konfigurace aplikace pro Facebook
Postup vytvoření aplikace Facebook k provedení ověřování je následující:
- Vytvořte aplikaci Facebook. Další informace najdete v tématu registrace a konfigurace aplikace v centru pro vývojáře na Facebooku.
- Přidejte do aplikace přihlašovací produkt Facebooku. Další informace najdete v tématu Přidání přihlašovacího jména na Facebooku do vaší aplikace nebo webu v centru pro vývojáře na Facebooku.
- Následujícím způsobem nakonfigurujte přihlašovací jméno Facebooku:
- Povolte přihlašovací jméno klienta OAuth.
- Povolte přihlašovací údaje webového OAuth.
- Nastavte platný identifikátor URI přesměrování OAuth na identifikátor URI webové aplikace App Service s
/.auth/login/facebook/callbackpřipojením.
Tato konfigurace znázorňuje následující snímek obrazovky:

Další informace najdete v tématu Registrace aplikace pomocí Facebooku.
Konfigurace ověřování Azure App Service
Proces konfigurace App Service jednoduchého ověřování je následující:
Na webu Azure Portal přejděte do webové aplikace App Service.
Na webu Azure Portal otevřete okno ověřování/autorizace a proveďte následující konfiguraci:
- Mělo by být zapnuté ověřování App Service.
- Akce, která se má provést v případě, že žádost není ověřená, by měla být nastavená na přihlášení pomocí Facebooku.
Tato konfigurace znázorňuje následující snímek obrazovky:
Aby bylo možné povolit tok ověřování, měla by být taky nakonfigurovaná webová aplikace App Service, aby komunikovala s aplikací Facebook. To se dá udělat tak, že vyberete poskytovatele identity Facebooku a zadáte ID aplikace a tajné hodnoty z aplikace na Facebooku v centru pro vývojáře pro Facebook. Další informace najdete v tématu Přidání informací o Facebooku do aplikace.
Xamarin.Forms Konfigurace aplikace
Postup pro konfiguraci Xamarin.Forms ukázkové aplikace je následující:
- Otevřete Xamarin.Forms řešení.
- Otevřete
Constants.csa aktualizujte hodnoty následujících konstant:EndpointUri– hodnota by měla být Cosmos DB adresa URL účtu z okna klíče účtu Cosmos DB.DatabaseName– hodnota by měla být název databáze dokumentů.CollectionName– hodnota by měla být název kolekce databáze dokumentů (v tomto případěUserItems).ResourceTokenBrokerUrl– hodnota by měla být adresa URL webové aplikace zprostředkovatele tokenů prostředků v okně Přehled účtu App Service.
Zahajuje se přihlášení
Ukázková aplikace zahájí proces přihlášení přesměrováním prohlížeče na adresu URL zprostředkovatele identity, jak je znázorněno v následujícím příkladu kódu:
var auth = new Xamarin.Auth.WebRedirectAuthenticator(
new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/facebook"),
new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/done"));
Tím dojde k zahájení toku ověřování OAuth mezi Azure App Service a Facebookem, které zobrazuje přihlašovací stránku Facebooku:

Přihlášení můžete zrušit stisknutím tlačítka Zrušit v iOS nebo stisknutím tlačítka zpět na Androidu. v takovém případě uživatel zůstane neověřený a uživatelské rozhraní poskytovatele identity se odebere z obrazovky.
Získání tokenu prostředku
Po úspěšném ověření se WebRedirectAuthenticator.Completed událost aktivuje. Následující příklad kódu ukazuje zpracování této události:
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);
...
}
...
}
}
};
Výsledkem úspěšného ověření je přístupový token, který je k dispozici AuthenticatorCompletedEventArgs.Account vlastnost. Přístupový token se extrahuje a použije v požadavku GET na rozhraní API zprostředkovatele tokenu prostředku resourcetoken .
resourcetokenrozhraní API používá přístupový token k vyžádání identity uživatele z facebooku, který se zase používá k vyžádání tokenu prostředku z Cosmos DB. Pokud pro uživatele v databázi dokumentů již existuje platný dokument oprávnění, je načten a dokument JSON obsahující token prostředku je vrácen do Xamarin.Forms aplikace. Pokud pro uživatele neexistuje platný dokument oprávnění, vytvoří se uživatel a oprávnění v databázi dokumentů a token prostředku se extrahuje z dokumentu oprávnění a vrátí se do Xamarin.Forms aplikace v dokumentu JSON.
Poznámka
Uživatel dokumentu databáze je prostředek přidružený k databázi dokumentů a každá databáze může obsahovat nula nebo více uživatelů. Oprávnění databáze dokumentů je prostředek přidružený k uživateli databáze dokumentu a každý uživatel může obsahovat nula nebo více oprávnění. Prostředek oprávnění poskytuje přístup k tokenu zabezpečení, který uživatel požaduje při pokusu o přístup k prostředku, jako je například dokument.
Pokud se resourcetoken rozhraní API úspěšně dokončí, pošle se v odpovědi stavový kód HTTP 200 (ok) spolu s dokumentem JSON, který obsahuje token prostředku. Následující data JSON zobrazují typickou zprávu o úspěšné odpovědi:
{
"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"
}
WebRedirectAuthenticator.CompletedObslužná rutina události přečte odpověď z resourcetoken rozhraní API a extrahuje token prostředku a ID uživatele. token prostředku se pak předává jako argument DocumentClient konstruktoru, který zapouzdřuje koncový bod, přihlašovací údaje a zásady připojení používané pro přístup k Cosmos DB a slouží ke konfiguraci a provádění požadavků na Cosmos DB. Token prostředku se posílá spolu s každou žádostí, aby měl přímý přístup k prostředku, a označuje, že je udělený přístup pro čtení a zápis do kolekce s oddíly ověřených uživatelů.
Načítání dokumentů
Načítání dokumentů, které patří pouze k ověřenému uživateli, lze dosáhnout vytvořením dotazu dokumentu, který obsahuje ID uživatele jako klíč oddílu a je znázorněn v následujícím příkladu kódu:
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>());
}
Dotaz asynchronně načte všechny dokumenty patřící k ověřenému uživateli ze zadané kolekce a umístí je do List<TodoItem> kolekce k zobrazení.
CreateDocumentQuery<T>Metoda Určuje Uri argument reprezentující kolekci, která má být dotazována na dokumenty, a FeedOptions objekt. FeedOptionsObjekt určuje, že dotaz může vrátit neomezený počet položek a ID uživatele jako klíč oddílu. Tím se zajistí, že se ve výsledku vrátí jenom dokumenty v dělené kolekci uživatele.
Poznámka
Všimněte si, že dokumenty oprávnění, které vytváří zprostředkovatel tokenů prostředků, jsou uloženy ve stejné kolekci dokumentů jako dokumenty vytvořené Xamarin.Forms aplikací. Proto dotaz na dokument obsahuje Where klauzuli, která aplikuje predikát filtrování na dotaz na kolekci dokumentů. Tato klauzule zajišťuje, že dokumenty oprávnění nejsou vráceny z kolekce dokumentů.
Další informace o načítání dokumentů z kolekce dokumentů najdete v tématu načítání dokumentů kolekce dokumentů.
Vkládání dokumentů
Před vložením dokumentu do kolekce dokumentů TodoItem.UserId by měla být vlastnost aktualizována hodnotou použitou jako klíč oddílu, jak je znázorněno v následujícím příkladu kódu:
item.UserId = UserId;
await client.CreateDocumentAsync(collectionLink, item);
Tím se zajistí, že se dokument vloží do dělené kolekce uživatele.
Další informace o vložení dokumentu do kolekce dokumentů naleznete v tématu Vložení dokumentu do kolekce dokumentů.
Odstraňování dokumentů
Hodnota klíče oddílu musí být zadána při odstraňování dokumentu z dělené kolekce, jak je znázorněno v následujícím příkladu kódu:
await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(Constants.DatabaseName, Constants.CollectionName, id),
new RequestOptions
{
PartitionKey = new PartitionKey(UserId)
});
tím je zajištěno, že Cosmos DB ví, ze které dělené kolekce se má dokument odstranit.
Další informace o odstranění dokumentu z kolekce dokumentů naleznete v tématu odstranění dokumentu z kolekce dokumentů.
Souhrn
Tento článek vysvětluje, jak zkombinovat řízení přístupu pomocí dělených kolekcí, aby uživatel měl přístup k dokumentům dokumentů databáze jenom v Xamarin.Forms aplikaci. Zadáním identity uživatele jako klíče oddílu zajistíte, aby dělená kolekce mohla ukládat pouze dokumenty pro tohoto uživatele.
Stažení ukázky
