NigeH
NigeH

Reputation: 55

AspNetIdentityDocumentDB and Cross partition query is required but disabled

I have an app that uses CosmosDb as the database and using AspNetIdentityDocument. When I call var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, false), i get the error Cross partition query is required but disabled. Please set x-ms-documentdb-query-enablecrosspartition to true, specify x-ms-documentdb-partitionkey

void InitializeDocumentClient(DocumentClient client) code attempts to create the container if not there. It works for the creating the container on my CossmosDb emultated store but fails on the Azure store requiring a partition key! My app works on the emulated store!

Program.cs

builder.Services.AddDefaultDocumentClientForIdentity(
            builder.Configuration.GetValue<Uri>("DocumentDbClient:EndpointUri"),
            builder.Configuration.GetValue<string>("DocumentDbClient:AuthorizationKey"),
            afterCreation: InitializeDocumentClient);

builder.Services.AddIdentity<ApplicationUser, DocumentDbIdentityRole>()
.AddDocumentDbStores(options =>
{
    options.UserStoreDocumentCollection = "AspNetIdentity";
    options.Database = "RNPbooking";
})
.AddDefaultTokenProviders();




void InitializeDocumentClient(DocumentClient client)

{ try { var db = client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri("RNPbooking")).Result; } catch (AggregateException ae) { ae.Handle(ex => { if (ex.GetType() == typeof(DocumentClientException) && ((DocumentClientException)ex).StatusCode == HttpStatusCode.NotFound) { var db = client.CreateDatabaseAsync(new Microsoft.Azure.Documents.Database() { Id = "RNPbooking" }).Result; return true; }

        return false;
    });
}

try
{
    var collection = client.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri("RNPbooking", "AspNetIdentity")).Result;
}
catch (AggregateException ae)
{
    ae.Handle(ex =>
    {
        if (ex.GetType() == typeof(DocumentClientException) && ((DocumentClientException)ex).StatusCode == HttpStatusCode.NotFound)
        {
            DocumentCollection collection = new DocumentCollection()
            {
                Id = "AspNetIdentity"
            };
            
            collection = client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("RNPbooking"),collection).Result;

            return true;
        }

        return false;
    });

} }

Controller

[Authorize(Roles = "Admin)]
public class AdminController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;
    
    public CosmosClient _client;

    public AdminController(
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,

        )
    
    {
        _userManager = userManager;
        _signInManager = signInManager;
        
    }

Upvotes: 1

Views: 164

Answers (2)

Matias Quaranta
Matias Quaranta

Reputation: 15583

UPDATED: From the code examples, you seem to be using this library https://github.com/codekoenig/AspNetCore.Identity.DocumentDb, AspNetCore.Identity.DocumentDb.

This error means the library you are using is performing a Document Query in their code at some point, it is not related to the creation of the Database or Collection.

The library code must be using CreateDocumentQuery somewhere, that code is missing:

 new FeedOptions { EnableCrossPartitionQuery = true };

If you search their code base, you will see multiple scenarios like that: https://github.com/codekoenig/AspNetCore.Identity.DocumentDb/search?q=CreateDocumentQuery

Because this code is out of your control, you should try and contact the owner to see if this is a fix they can do on their end. The code for the library doesn't seem to have been updated in several years, so maybe this library is not maintained?

Upvotes: 1

Sajeetharan
Sajeetharan

Reputation: 222552

You need to fill in CreateDocumentCollectionUri method with FeedOptions object as a parameter

 UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),new FeedOptions { EnableCrossPartitionQuery=true})

Upvotes: 1

Related Questions