public IEnumerable<Dashboard> Dashboards() { if (_dashboards != null && _dashboardLoaded.Add(_cacheLife) < DateTime.UtcNow) { return _dashboards; } var connection = new DocumentDbConnectionString(_connectionString); using (var client = new DocumentClient(connection.AccountEndpoint, connection.AccountKey)) { var database = client.ReadDatabaseFeedAsync().Result; var dashboardCollection = client.ReadDocumentCollectionFeedAsync( database.Single(x => x.Id == connection.DatabaseName).CollectionsLink).Result; var dashboards = client.ReadDocumentFeedAsync(dashboardCollection.Single(x => x.Id == "dashboards").DocumentsLink) .Result; _dashboards = dashboards.Select(x => new Dashboard { Title = x.GetPropertyValue<string>("Title"), Slug = x.GetPropertyValue<string>("Slug"), Sections = x.GetPropertyValue<IEnumerable<DashboardSection>>("Sections") }).OrderBy(x => x.Title); _dashboardLoaded = DateTime.UtcNow; return _dashboards; } }
private static async Task AttemptAdminOperationsAsync(string collectionLink, Permission permission) { using (DocumentClient client = new DocumentClient(new Uri(endpointUrl), permission.Token)) { //try read collection > should succeed because user1 was granted Read permission on col1 var docs = await client.ReadDocumentFeedAsync(collectionLink); foreach (Document doc in docs) { Console.WriteLine(doc); } //try iterate databases > should fail because the user has no Admin rights //but only read access to a single collection and therefore //cannot access anything outside of that collection. try { var databases = await client.ReadDatabaseFeedAsync(); foreach (Database database in databases) { throw new ApplicationException("Should never get here"); } } catch (DocumentClientException de) { //expecting an Unauthorised exception, anything else, rethrow if (de.StatusCode != HttpStatusCode.Unauthorized) throw; } } }
private static async Task AttemptReadFromTwoCollections(List<string> collectionLinks, List<Permission> permissions) { //Now, we're going to use multiple permission tokens. //In this case, a read Permission on col1 AND another read Permission for col2 //This means the user should be able to read from both col1 and col2, but not have //the ability to read other collections should they exist, nor any admin access. //the user will also not have permission to write in either collection using (DocumentClient client = new DocumentClient(new Uri(endpointUrl), permissions)) { FeedResponse<dynamic> response; //read collection 1 > should succeed response = await client.ReadDocumentFeedAsync(collectionLinks[0]); //read from collection 2 > should succeed response = await client.ReadDocumentFeedAsync(collectionLinks[1]); //attempt to write a doc in col 2 > should fail with Forbidden try { await client.CreateDocumentAsync(collectionLinks[1], new { id = "not allowed" }); //should never get here, because we expect the create to fail throw new ApplicationException("should never get here"); } catch (DocumentClientException de) { //expecting an Forbidden exception, anything else, rethrow if (de.StatusCode != HttpStatusCode.Forbidden) throw; } } return; }