Azure Cosmos DB Belge Veritabanı ile Kullanıcıların Kimliğini Doğrulama ve Xamarin.Forms

Download Sample Örneği indirme

Azure Cosmos DB belge veritabanları, sınırsız depolama ve aktarım hızını desteklerken birden çok sunucuya ve bölüme yayabilen bölümlenmiş koleksiyonları destekler. Bu makalede, kullanıcının bir uygulamada yalnızca kendi belgelerine erişebilmesi için erişim denetimini bölümlenmiş koleksiyonlarla Xamarin.Forms birleştirme açıklanmaktadı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ğinin bölüm anahtarı olarak belirtilmesi, yalnızca o kullanıcının belgelerini depolayacak bölümlenmiş bir koleksiyona neden olur. Bu, kullanıcı ve öğe sayısı arttıkça Azure Cosmos DB belge veritabanının ölçeklendirilmesini de sağlar.

Tüm koleksiyonlara erişim verilmelidir ve NoSQL için Azure Cosmos DB erişim denetimi modeli iki tür erişim yapısı tanımlar:

  • Ana anahtarlar , bir Azure Cosmos DB hesabı içindeki tüm kaynaklara tam yönetici erişimi sağlar ve bir Azure 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 Azure Cosmos DB kaynağı için sahip olduğu izin arasındaki ilişkiyi yakalar.

Ana anahtarın kullanıma açılması, kötü amaçlı veya ihmalkar kullanım olasılığına karşı bir Azure Cosmos DB hesabı açar. Ancak Azure Cosmos DB kaynak belirteçleri, istemcilerin verilen izinlere göre bir Azure Cosmos DB hesabındaki belirli kaynakları okumasına, yazmasına ve silmesine olanak tanıyan güvenli bir mekanizma sağlar.

Bir mobil uygulamaya kaynak belirteçleri isteme, oluşturma ve teslim etme konusunda 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ısını nasıl kullandığına ilişkin üst düzey bir genel bakış gösterilmektedir:

Document Database Authentication Process

Kaynak belirteci aracısı, Azure Cosmos DB hesabının ana anahtarına sahip Azure Uygulaması Hizmeti'nde barındırılan orta katmanlı bir Web API hizmetidir. Örnek uygulama, belge veritabanı verilerine erişimi yönetmek için kaynak belirteci aracısını aşağıdaki gibi kullanır:

  1. Oturum açmadaXamarin.Forms, uygulama bir kimlik doğrulama akışı başlatmak için Hizmet Azure Uygulaması ile iletişim kurar.
  2. Azure Uygulaması Hizmeti, Facebook ile bir OAuth kimlik doğrulama akışı gerçekleştirir. Kimlik doğrulama akışı tamamlandıktan Xamarin.Forms sonra uygulama bir erişim belirteci alır.
  3. Uygulama, Xamarin.Forms kaynak belirteci aracısından kaynak belirteci istemek için erişim belirtecini kullanır.
  4. Kaynak belirteci aracısı, kullanıcının kimliğini Facebook'tan istemek için erişim belirtecini 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 Azure Cosmos DB'den kaynak belirteci istemek için kullanılır.
  5. Uygulama Xamarin.Forms , kaynak belirteci tarafından tanımlanan izinlerle Azure Cosmos DB kaynaklarına doğrudan erişmek için kaynak belirtecini kullanır.

Not

Kaynak belirtecinin süresi dolduğunda, sonraki belge veritabanı istekleri 401 yetkisiz özel durumu alır. Bu noktada uygulamaların Xamarin.Forms kimliği yeniden oluşturması ve yeni bir kaynak belirteci istemesi gerekir.

Azure Cosmos DB bölümleme hakkında daha fazla bilgi için bkz . Azure Cosmos DB'de bölümleme ve ölçeklendirme. Azure Cosmos DB erişim denetimi hakkında daha fazla bilgi için bkz. NoSQL için Azure Cosmos DB'de Azure Cosmos DB verilerine erişimin güvenliğini sağlama ve Erişim denetimi.

Ayarlama

Kaynak belirteci aracısını bir Xamarin.Forms uygulamayla tümleştirme işlemi aşağıdaki gibidir:

  1. Erişim denetimini kullanacak bir Azure Cosmos DB hesabı oluşturun. Daha fazla bilgi için bkz . Azure Cosmos DB Yapılandırması.
  2. Kaynak belirteci aracısını barındırmak için bir Azure Uygulaması Hizmeti oluşturun. Daha fazla bilgi için bkz. hizmet yapılandırması Azure Uygulaması.
  3. Kimlik doğrulaması gerçekleştirmek için bir Facebook uygulaması oluşturun. Daha fazla bilgi için bkz. Facebook Uygulama Yapılandırması.
  4. facebook ile kolay kimlik doğrulaması gerçekleştirmek için Azure Uygulaması Hizmeti'ni yapılandırın. Daha fazla bilgi için bkz. hizmet kimlik doğrulaması yapılandırması Azure Uygulaması.
  5. Xamarin.Forms Örnek uygulamayı Azure Uygulaması Hizmeti ve Azure Cosmos DB ile iletişim kuracak şekilde yapılandırın. Daha fazla bilgi için bkz Xamarin.Forms . Uygulama Yapılandırması.

Not

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Azure Cosmos DB Yapılandırması

Erişim denetimini kullanacak bir Azure Cosmos DB hesabı oluşturma işlemi aşağıdaki gibidir:

  1. Bir Azure Cosmos DB hesabı oluşturun. Daha fazla bilgi için bkz . Azure Cosmos DB hesabı oluşturma.
  2. Azure Cosmos DB hesabında öğesinin bölüm anahtarını /useridbelirterek adlı UserItemsyeni bir koleksiyon oluşturun.

Azure Uygulaması Hizmet Yapılandırması

Kaynak belirteci aracısını Azure Uygulaması Hizmeti'nde barındırma işlemi aşağıdaki gibidir:

  1. Azure portalında yeni bir App Service web uygulaması oluşturun. Daha fazla bilgi için bkz. App Service Ortamı web uygulaması oluşturma.

  2. Azure portalında web uygulamasının Uygulama Ayarlar dikey penceresini açın ve aşağıdaki ayarları ekleyin:

    • accountUrl – değer, Azure Cosmos DB hesabının Anahtarlar dikey penceresindeki Azure Cosmos DB hesabı URL'si olmalıdır.
    • accountKey – değer, Azure Cosmos DB hesabının Anahtarlar dikey penceresindeki Azure Cosmos DB ana anahtarı (birincil veya ikincil) olmalıdır.
    • databaseId – değeri Azure Cosmos DB veritabanının adı olmalıdır.
    • collectionId– değeri Azure Cosmos DB koleksiyonunun adı olmalıdır (bu örnekte). UserItems
    • hostUrl – değer, App Service hesabının Genel Bakış dikey penceresindeki web uygulamasının URL'si olmalıdır.

    Aşağıdaki ekran görüntüsünde bu yapılandırma gösterilmektedir:

    App Service Web App Settings

  3. Kaynak belirteci aracısı çözümünü Azure Uygulaması Hizmeti web uygulamasında 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:

  1. Bir Facebook uygulaması oluşturun. Daha fazla bilgi için bkz . Facebook Geliştirici Merkezi'ne Uygulama Kaydetme ve Yapılandırma.
  2. Facebook Oturum Açma ürününü uygulamaya ekleyin. Daha fazla bilgi için bkz . Facebook Geliştirici Merkezi'nin Uygulamanıza veya Web Sitenize Facebook Oturum Açma Bilgileri Ekleme.
  3. Facebook Oturum Açma bilgilerini aşağıdaki gibi yapılandırın:
    • İstemci OAuth Oturum Açma'yı etkinleştirin.
    • Web OAuth Oturum Açma'yı etkinleştirin.
    • Geçerli OAuth yeniden yönlendirme URI'sini App Service web uygulamasının /.auth/login/facebook/callback URI'sine ekleyin ve ekleyin.

Aşağıdaki ekran görüntüsünde bu yapılandırma gösterilmektedir:

Facebook Login OAuth Settings

Daha fazla bilgi için bkz . Uygulamanızı Facebook'a kaydetme.

Azure Uygulaması Hizmet Kimlik Doğrulaması Yapılandırması

App Service kolay kimlik doğrulamasını yapılandırma işlemi aşağıdaki gibidir:

  1. Azure Portalı'nda App Service web uygulamasına gidin.

  2. Azure Portalı'nda Kimlik Doğrulaması / Yetkilendirme dikey penceresini açın ve aşağıdaki yapılandırmayı gerçekleştirin:

    • App Service Kimlik Doğrulaması açık olmalıdır.
    • bir isteğin kimliği doğrulanmadığında gerçekleştirilecek eylem Facebook ile oturum aç olarak ayarlanmalıdır.

    Aşağıdaki ekran görüntüsünde bu yapılandırma gösterilmektedir:

    App Service Web App Authentication Settings

App Service web uygulaması, kimlik doğrulama akışını etkinleştirmek için Facebook uygulamasıyla iletişim kuracak şekilde de yapılandırılmalıdır. Bu, Facebook kimlik sağlayıcısını seçip Facebook Geliştirici Merkezi'nin Facebook uygulama ayarlarından Uygulama Kimliği ve Uygulama Gizli anahtarı değerlerini girerek gerçekleştirilebilir. 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:

  1. Xamarin.Forms Çözümü açın.
  2. Aşağıdaki sabitlerin değerlerini açın Constants.cs ve güncelleştirin:
    • EndpointUri – değer, Azure Cosmos DB hesabının Anahtarlar dikey penceresindeki Azure Cosmos DB hesabı URL'si olmalıdır.
    • DatabaseName – değeri belge veritabanının adı olmalıdır.
    • CollectionName– değer, belge veritabanı koleksiyonunun adı olmalıdır (bu örnekte). UserItems
    • ResourceTokenBrokerUrl – değer, App Service hesabının Genel Bakış dikey penceresindeki kaynak belirteci aracısı web uygulamasının URL'si olmalıdır.

Oturum Açma Başlatılıyor

Örnek uygulama, aşağıdaki örnek kodda gösterildiği gibi bir tarayıcıyı kimlik sağlayıcısı URL'sine yönlendirerek oturum açma işlemini başlatır:

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

Bu, Azure Uygulaması Hizmeti ile Facebook arasında OAuth kimlik doğrulaması akışının başlatılmasına neden olur ve bu da Facebook oturum açma sayfasını görüntüler:

Facebook Login

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 tetikler. Aşağıdaki kod örneği bu olayın işlenmesini gösterir:

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 AuthenticatorCompletedEventArgs.Account özellik olan bir erişim belirtecidir. Erişim belirteci ayıklanır ve kaynak belirteci aracısının API'sine resourcetoken bir GET isteğinde kullanılır.

resourcetoken API, kullanıcının kimliğini Facebook'tan istemek için erişim belirtecini kullanır ve bu da Azure Cosmos DB'den kaynak belirteci istemek için kullanılır. Belge veritabanındaki kullanıcı için geçerli bir izin belgesi zaten varsa, alınır ve kaynak belirtecini içeren bir JSON belgesi uygulamaya döndürülür Xamarin.Forms . Kullanıcı için geçerli bir izin belgesi yoksa, belge veritabanında bir kullanıcı ve izin oluşturulur ve kaynak belirteci izin belgesinden ayıklanır ve bir JSON belgesinde uygulamaya döndürülür Xamarin.Forms .

Not

Belge veritabanı kullanıcısı, belge veritabanıyla ilişkilendirilmiş bir kaynaktır ve her veritabanı sıfır veya daha fazla kullanıcı içerebilir. Belge veritabanı izni, belge veritabanı kullanıcısıyla ilişkilendirilmiş bir kaynaktır ve her kullanıcı sıfır veya daha fazla izin içerebilir. İzin kaynağı, belge gibi bir kaynağa erişmeye çalışırken kullanıcının gerektirdiği bir güvenlik belirtecine erişim sağlar.

resourcetoken API başarıyla tamamlanırsa, yanıtta 200 (Tamam) HTTP durum kodunu ve kaynak belirtecini içeren bir JSON belgesini 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 işleyicisi WebRedirectAuthenticator.Completed API'den resourcetoken yanıtı okur ve kaynak belirtecini ve kullanıcı kimliğini ayıklar. Kaynak belirteci daha sonra oluşturucuya DocumentClient bağımsız değişken olarak geçirilir. Bu, Azure Cosmos DB'ye erişmek için kullanılan uç noktayı, kimlik bilgilerini ve bağlantı ilkesini kapsüller ve Azure Cosmos DB'de istekleri yapılandırmak ve yürütmek için kullanılır. Kaynak belirteci her 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şimi verildiğini gösterir.

Belgeleri Alma

Yalnızca kimliği doğrulanmış kullanıcıya ait belgelerin alınması, kullanıcının kimliğini bölüm anahtarı olarak içeren ve aşağıdaki kod örneğinde gösterilen bir belge sorgusu oluşturularak gerçekleştirilebilir:

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 belirtilen koleksiyondan zaman uyumsuz olarak alır ve görüntülemek üzere bir List<TodoItem> koleksiyona yerleştirir.

CreateDocumentQuery<T> yöntemi, belgeler ve bir Uri nesne için sorgulanması gereken koleksiyonu temsil eden bir FeedOptions bağımsız değişken belirtir. FeedOptions nesnesi, sorgu tarafından sınırsız sayıda öğenin döndürülebileceğini ve kullanıcının kimliğinin bölüm anahtarı olarak döndürülebileceğini belirtir. Bu, sonuçta yalnızca kullanıcının bölümlenmiş koleksiyonundaki belgelerin döndürülmesini sağlar.

Not

Kaynak belirteci aracısı tarafından oluşturulan izin belgelerinin, uygulama tarafından oluşturulan belgelerle aynı belge koleksiyonunda Xamarin.Forms depolandığını unutmayın. Bu nedenle, belge sorgusu, belge koleksiyonuna karşı sorguya filtreleme koşulu uygulayan bir yan tümcesi içerir Where . Bu yan tümce, izin belgelerinin belge koleksiyonundan döndürülmesini sağlar.

Belge koleksiyonundan belge alma hakkında daha fazla bilgi için bkz . Belge Koleksiyonu Belgelerini Alma.

Belge Ekleme

Belge koleksiyonuna belge eklemeden önce, TodoItem.UserId özellik aşağıdaki kod örneğinde gösterildiği gibi bölüm anahtarı olarak kullanılan değerle güncelleştirilmelidir:

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

Bu, belgenin kullanıcının bölümlenmiş koleksiyonuna eklenmesini sağlar.

Belge koleksiyonuna belge ekleme hakkında daha fazla bilgi için bkz . Belge Koleksiyonuna Belge Ekleme.

Belgeleri Silme

Bölümlenmiş koleksiyondan bir belge silinirken, aşağıdaki kod örneğinde gösterildiği gibi bölüm anahtarı değeri belirtilmelidir:

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

Bu, Azure Cosmos DB'nin belgenin hangi bölümlenmiş koleksiyondan silindiğini bildiğinden emin olmasını sağlar.

Belge koleksiyonundan belge silme hakkında daha fazla bilgi için bkz . Belge Koleksiyonundan Belge Silme.

Özet

Bu makalede, bir kullanıcının uygulamadaki Xamarin.Forms yalnızca kendi belge veritabanı belgelerine erişebilmesi için erişim denetiminin bölümlenmiş koleksiyonlarla nasıl birleştirildiği açıklanmıştır. Kullanıcının kimliğinin bölüm anahtarı olarak belirtilmesi, bölümlenmiş bir koleksiyonun yalnızca o kullanıcının belgelerini depolamasını sağlar.