Azure Cosmos DB Belge Veritabanı ile Kullanıcıların Kimliğini Doğrulama veXamarin.Forms
Azure Cosmos DB belge veritabanları, sınırsız depolama ve aktarım hızını desteklerken birden çok sunucuya ve bölüme yayılan bölümlenmiş koleksiyonları destekler. Bu makalede, bir kullanıcının bir uygulama içinde yalnızca kendi belgelerine erişmesi için erişim denetimi ile bölümlenmiş koleksiyonları birleştirme Xamarin.Forms açıklanmıştır.
Genel Bakış
Bölümlenmiş koleksiyon oluşturulurken bölüm anahtarı belirtilmelidir ve aynı bölüm anahtarına sahip belgeler aynı bölümde depolanır. Bu nedenle, kullanıcının kimliğini bölüm anahtarı olarak belirtmek, yalnızca o kullanıcı için belgeleri depolar bölümlenmiş bir koleksiyona neden olur. Bu, kullanıcı ve öğe Cosmos artarak Azure Cosmos DB belge veritabanının ölçeklendirilene bir hizmettir.
Herhangi bir koleksiyona erişim ver SQL API erişim denetimi modeli iki tür erişim yapısı tanımlar:
- Ana anahtarlar, bir Cosmos DB hesabı içindeki tüm kaynaklara tam yönetici erişimi sağlar ve bir Cosmos DB hesabı oluşturulduğunda oluşturulur.
- Kaynak belirteçleri, bir veritabanının kullanıcısı ile kullanıcının koleksiyon veya belge gibi belirli bir veritabanı Cosmos izni arasındaki ilişkiyi yakalar.
Ana anahtarın açığa çıkar olması, Cosmos veya ihmalkar kullanım olasılığına karşı bir veritabanı hesabı açar. Ancak Azure Cosmos DB kaynak belirteçleri, istemcilerin verilen izinlere göre bir Azure Cosmos DB hesabı içinde belirli kaynakları okumasına, yazmasına ve silmelerine izin vermek için güvenli bir mekanizma sağlar.
Mobil uygulamaya kaynak belirteçleri talep etmek, oluşturmak ve teslim etmek için tipik bir yaklaşım, kaynak belirteci aracısı kullanmaktır. Aşağıdaki diyagramda, örnek uygulamanın belge veritabanı verilerine erişimi yönetmek için kaynak belirteci aracıyı nasıl kullandığına ilişkin üst düzey bir genel bakış yer alır:

Kaynak belirteci aracısı, Azure App Service db hesabının ana anahtarına sahip olan, Cosmos web API'si hizmetidir. Örnek uygulama, belge veritabanı verilerine erişimi yönetmek için kaynak belirteci aracıyı aşağıdaki gibi kullanır:
- Oturum açmada, Xamarin.Forms uygulama bir Azure App Service başlatmak için uygulamayla iletişime geçmektedir.
- Azure App Service Facebook ile bir OAuth kimlik doğrulaması akışı gerçekleştirir. Kimlik doğrulama akışı tamamlandıktan sonra Xamarin.Forms uygulama bir erişim belirteci alır.
- Uygulama, Xamarin.Forms kaynak belirteci aracıdan kaynak belirteci talep etmek için erişim belirteci kullanır.
- Kaynak belirteci aracısı, facebook'tan kullanıcının kimliğini talep etmek için erişim belirteci kullanır. Ardından kullanıcının kimliği, kimliği doğrulanmış kullanıcının bölümlenmiş koleksiyonuna okuma/yazma erişimi vermek için kullanılan Cosmos DB'den bir kaynak belirteci talep etmek için kullanılır.
- Uygulama, Xamarin.Forms kaynak belirteci tarafından tanımlanan izinlerle Cosmos veritabanı kaynaklarına doğrudan erişmek için kaynak belirteci kullanır.
Not
Kaynak belirtecinde süre dolduğunda, sonraki belge veritabanı istekleri 401 yetkisiz özel durumu alır. Bu noktada, Xamarin.Forms uygulamalar kimliği yeniden kurmalı ve yeni bir kaynak belirteci talep eder.
Veritabanı bölümleme hakkında Cosmos fazla bilgi için bkz. Azure Cosmos DB'debölümleme ve ölçeklendirme. Veritabanı erişim denetimi hakkında daha Cosmos için bkz. Cosmos DB verilerine erişimin güvenliğini sağlama ve SQL API'sinde erişim denetimi.
Kurulum
Kaynak belirteci aracıyı bir uygulamayla tümleştirme Xamarin.Forms işlemi aşağıdaki gibidir:
- Erişim Cosmos bir veritabanı hesabı oluşturun. Daha fazla bilgi için bkz. Azure Cosmos DB Yapılandırması.
- Kaynak Azure App Service aracıyı barındırmak için bir kaynak grubu oluşturun. Daha fazla bilgi için bkz. Azure App Service Yapılandırma.
- Kimlik doğrulaması gerçekleştirmek için bir Facebook uygulaması oluşturun. Daha fazla bilgi için bkz. Facebook Uygulama Yapılandırması.
- Hesabı, Azure App Service Facebook ile kolay kimlik doğrulaması gerçekleştirecek şekilde yapılandırma. Daha fazla bilgi için bkz. Azure App Service Kimlik Doğrulaması Yapılandırması.
- Örnek uygulamayı Xamarin.Forms veritabanı ve veritabanı ile iletişim Azure App Service Cosmos yapılandırma. Daha fazla bilgi için bkz. Xamarin.Forms Application Configuration.
Not
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Azure Cosmos DB Yapılandırması
Erişim denetimi Cosmos db hesabı oluşturma işlemi aşağıdaki gibidir:
- Bir Cosmos DB hesabı oluşturun. Daha fazla bilgi için bkz. Azure Cosmos DB hesabı oluşturma.
- Veritabanı Cosmos, bölüm anahtarını belirterek adlı
UserItemsyeni bir koleksiyon/useridoluşturun.
Azure App Service Yapılandırması
Kaynak belirteci aracıyı kaynak Azure App Service barındırma işlemi aşağıdaki gibidir:
Yeni Azure portal yeni bir web App Service oluşturun. Daha fazla bilgi için bkz. Web uygulaması oluşturma App Service Ortamı.
Uygulama Azure portal web uygulamasının Uygulama Ayarlar dikey penceresi açın ve aşağıdaki ayarları ekleyin:
accountUrl– değer, Cosmos DB hesabının Anahtarlar dikey penceresindeki veritabanı hesabı URL'Cosmos olmalıdır.accountKey– değer, Cosmos DB hesabının Anahtarlar dikey penceresindeki veritabanı ana anahtarı (birincil veya ikincil) Cosmos gerekir.databaseId– değer, Cosmos DB veritabanının adı olmalıdır.collectionId– değerin Cosmos DB koleksiyonunun adı olması gerekir (buUserItemsdurumda).hostUrl– değer, hesap hesabın Genel Bakış dikey penceresindeki web uygulamasının URL'App Service olmalıdır.
Aşağıdaki ekran görüntüsü bu yapılandırmayı gösterir:
Kaynak belirteci aracı çözümünü web Azure App Service yayımlayın.
Facebook Uygulama Yapılandırması
Kimlik doğrulaması gerçekleştirmek için Bir Facebook uygulaması oluşturma işlemi aşağıdaki gibidir:
- Bir Facebook uygulaması oluşturun. Daha fazla bilgi için bkz. Facebook Geliştirici Merkezi'nde Uygulama Kaydetme ve Yapılandırma.
- Uygulamaya Facebook Oturum Açma ürününü ekleyin. Daha fazla bilgi için bkz. Facebook Geliştirici Merkezi'nde Uygulamanıza veya Web Sitenize Facebook Oturumu Ekleme.
- Facebook Oturum Açma bilgilerini aşağıdaki gibi yapılandırabilirsiniz:
- İstemci OAuth Oturum Açma'sini etkinleştirin.
- Web OAuth Oturum Açma'ya tıklayın.
- Geçerli OAuth yeniden yönlendirme URI'sini, web uygulamasının App Service
/.auth/login/facebook/callbackURI'sini ayarlayın.
Aşağıdaki ekran görüntüsü bu yapılandırmayı gösterir:

Daha fazla bilgi için bkz. Uygulamalarınızı Facebook'a kaydetme.
Azure App Service Kimlik Doğrulaması Yapılandırması
Kolay kimlik doğrulaması App Service yapılandırma işlemi aşağıdaki gibidir:
Azure Portal'da App Service gidin.
Azure Portal'da Kimlik Doğrulaması / Yetkilendirme dikey penceresi açın ve aşağıdaki yapılandırmayı gerçekleştirin:
- App Service Kimlik Doğrulaması'nın açık olması gerekir.
- bir isteğin kimliği doğrulanmamışsa, eylemin Facebook'ta oturum aç olarak ayarlanmış olması gerekir.
Aşağıdaki ekran görüntüsü bu yapılandırmayı gösterir:
Bu App Service web uygulaması, kimlik doğrulama akışını etkinleştirmek için Facebook uygulamasıyla iletişim kuracak şekilde de yapılandırıldı. Bu, Facebook kimlik sağlayıcısını seçerek ve Facebook Geliştirici Merkezi'nde Facebook uygulama ayarlarından Uygulama Kimliği ve App Secret değerleri girerek gerçek olabilir. Daha fazla bilgi için bkz. Uygulamanıza Facebook bilgileri ekleme.
Xamarin.Forms Uygulama Yapılandırması
Örnek uygulamayı yapılandırma Xamarin.Forms işlemi aşağıdaki gibidir:
- Çözümü Xamarin.Forms açın.
- aşağıdaki
Constants.cssabitlerin değerlerini açın ve güncelleştirin:EndpointUri– değer, Cosmos DB hesabının Anahtarlar dikey penceresindeki veritabanı hesabı URL'Cosmos olmalıdır.DatabaseName– değer belge veritabanının adı olmalıdır.CollectionName– değer belge veritabanı koleksiyonunun adı olmalıdır (buUserItemsdurumda).ResourceTokenBrokerUrl– değer, kaynak hesabının Genel Bakış dikey penceresindeki kaynak belirteci aracı web uygulamasının URL'App Service olmalıdır.
Oturum Açma Başlat
Örnek uygulama, bir tarayıcıyı aşağıdaki örnek kodda olduğu gibi bir kimlik sağlayıcısı URL'sini yeniden yönlendirerek oturum açma işlemini başlatıyor:
var auth = new Xamarin.Auth.WebRedirectAuthenticator(
new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/facebook"),
new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/done"));
Bu, Facebook oturum açma sayfasını görüntüleyen Azure App Service Facebook arasında bir OAuth kimlik doğrulama akışının başlatılmış olmasına neden olur:

Oturum açma işlemi, iOS'ta İptal düğmesine basılarak veya Android'de Geri düğmesine basılarak iptal edilebilir. Bu durumda kullanıcı kimliği doğrulanmamış olarak kalır ve kimlik sağlayıcısı kullanıcı arabirimi ekrandan kaldırılır.
Kaynak Belirteci Alma
Başarılı kimlik doğrulamasının ardından WebRedirectAuthenticator.Completed olay etkin olur. Aşağıdaki kod örneği bu olayın işlenmesini gösteriyor:
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);
...
}
...
}
}
};
Başarılı bir kimlik doğrulamasının sonucu, kullanılabilir özellik olan bir erişim AuthenticatorCompletedEventArgs.Account belirtecidir. Erişim belirteci ayıklanır ve kaynak belirteci aracı api'sinde bir GET isteğinde resourcetoken kullanılır.
API, kullanıcı kimliğini Facebook'tan talep etmek için erişim belirteci kullanır ve bu kimlik de Cosmos resourcetoken DB'den kaynak belirteci isteğinde Cosmos kullanılır. Belge veritabanında kullanıcı için geçerli bir izin belgesi zaten varsa, bu belge alınır ve kaynak belirteci içeren bir JSON belgesi uygulamaya Xamarin.Forms döndürülür. Kullanıcı için geçerli bir izin belgesi yoksa, belge veritabanında bir kullanıcı ve izin oluşturulur ve kaynak belirteci izin belgesinde ayıklanır ve JSON belgesinde Xamarin.Forms uygulamaya döndürülür.
Not
Belge veritabanı kullanıcısı, bir belge veritabanıyla ilişkilendirilmiş bir kaynaktır ve her veritabanı sıfır veya daha fazla kullanıcı içerebilir. Belge veritabanı izni, bir belge veritabanı kullanıcısıyla ilişkili bir kaynaktır ve her kullanıcı sıfır veya daha fazla izin içerebilir. İzin kaynağı, kullanıcının belge gibi bir kaynağa erişmeye çalışırken gerektirdiği bir güvenlik belirtecsine erişim sağlar.
API resourcetoken başarıyla tamamlanırsa yanıtta HTTP durum kodu 200 (Tamam) ve kaynak belirteci içeren bir JSON belgesi gönderir. Aşağıdaki JSON verileri tipik bir başarılı yanıt iletisini gösterir:
{
"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"
}
Olay WebRedirectAuthenticator.Completed işleyicisi API'den yanıtı resourcetoken okur ve kaynak belirteci ile kullanıcı kimliğini ayıklar. Kaynak belirteci daha sonra oluşturucuya bağımsız değişken olarak geçir edilir. Bu, Cosmos DB'ye erişmek için kullanılan uç nokta, kimlik bilgileri ve bağlantı ilkesi kapsüller ve Cosmos DB'ye yönelik istekleri yapılandırmak ve yürütmek için DocumentClient kullanılır. Kaynak belirteci, bir kaynağa doğrudan erişim isteğiyle birlikte gönderilir ve kimliği doğrulanmış kullanıcıların bölümlenmiş koleksiyonuna okuma/yazma erişiminin ver olduğunu gösterir.
Belgeleri Alma
Yalnızca kimliği doğrulanmış kullanıcıya ait olan belgelerin alınması, kullanıcının kimliğini bölüm anahtarı olarak içeren bir belge sorgusu oluşturarak elde edilebilir ve aşağıdaki kod örneğinde gösterlanmıştır:
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>());
}
Sorgu, kimliği doğrulanmış kullanıcıya ait tüm belgeleri zaman uyumsuz olarak belirtilen koleksiyondan alıyor ve görüntü için bir List<TodoItem> koleksiyona yer alıyor.
yöntemi, CreateDocumentQuery<T> belgeler için Uri sorgulanan koleksiyonu temsil eden bir bağımsız değişken ve bir nesnesi FeedOptions belirtir. nesnesi, sorgu tarafından sınırsız sayıda öğenin döndürüleb ve bölüm anahtarı FeedOptions olarak kullanıcının kimliğini belirtir. Bu, sonuçta yalnızca kullanıcının bölümlenmiş koleksiyonunda yer alan belgelerin döndürüldür.
Not
Kaynak belirteci aracısı tarafından oluşturulan izin belgelerinin, uygulama tarafından oluşturulan belgelerle aynı belge koleksiyonunda depolandığına dikkat Xamarin.Forms alın. Bu nedenle, belge sorgusu, belge koleksiyonuna karşı sorguya bir filtreleme şartı uygulanan Where bir yan tümcesi içerir. Bu yan tümce, izin belgelerinin belge koleksiyonundan döndürülmalarını sağlar.
Belge koleksiyonundan belgeleri alma hakkında daha fazla bilgi için bkz. Belge Koleksiyonu Belgelerini Alma.
Belge Ekleme
Bir belge koleksiyonuna belge eklemeden önce, özelliği aşağıdaki kod örneğinde olduğu gibi bölüm anahtarı olarak kullanılan TodoItem.UserId değerle güncelleştirilmiş olması gerekir:
item.UserId = UserId;
await client.CreateDocumentAsync(collectionLink, item);
Bu, belgenin kullanıcının bölümlenmiş koleksiyonuna eklenmelerini sağlar.
Belge koleksiyonuna belge ekleme hakkında daha fazla bilgi için bkz. Belge Koleksiyonuna Belge Ekleme.
Belgeleri Silme
Aşağıdaki kod örneğinde olduğu gibi bölümlenmiş koleksiyondan belge silinirken bölüm anahtarı değeri belirtilmelidir:
await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(Constants.DatabaseName, Constants.CollectionName, id),
new RequestOptions
{
PartitionKey = new PartitionKey(UserId)
});
Bu, Cosmos DB'nin belgeyi hangi bölümlenmiş koleksiyondan sileceklerini bilir.
Belge koleksiyonundan belge silme hakkında daha fazla bilgi için bkz. Belge Koleksiyonundan Belge Silme.
Özet
Bu makalede, bir kullanıcının bir uygulama içinde yalnızca kendi belge veritabanı belgelerine erişene kadar bölümlenmiş koleksiyonlarla erişim denetimi birleştirmesi Xamarin.Forms açıklanmıştır. Kullanıcının kimliğini bölüm anahtarı olarak belirtmek, bölümlenmiş bir koleksiyonun yalnızca o kullanıcıya uygun belgeleri depolayamalarını sağlar.
Örneği indirme
