Search code examples
c#mongodbmongodb-.net-driver

C# MongoDB not serializing System.Security.Claims.Claim


I seem to be unable to serialize Claim - what am I doing wrong? Other object serializations using this method works fine.

Code

var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("TEST");
var collection = database.GetCollection<Claim>("Claims");

var payload = new Claim("name", "value");
collection.InsertOne(payload);

Result

An object gets inserted into MongoDB but nothing other than _id gets set/populated.

enter image description here

Using .NET Core 2.0.x and MongoDB.Driver 2.5.0.

Update 1

Mapping members manually seems to work; it's just when it's auto-mapped that it seems to fail.

BsonClassMap.RegisterClassMap<Claim>(cm =>
{
    cm.SetIgnoreExtraElements(true);
    cm.MapMember(c => c.Issuer);
    cm.MapMember(c => c.OriginalIssuer);
    cm.MapMember(c => c.Properties);
    cm.MapMember(c => c.Subject);
    cm.MapMember(c => c.Type);
    cm.MapMember(c => c.Value);
    cm.MapMember(c => c.ValueType);
    cm.MapCreator(c => new Claim(c.Type, c.Value, c.ValueType, c.Issuer, c.OriginalIssuer, c.Subject));
});

Solution

  • The Claim class must be manually mapped due having no parameterless constructor and no public setters.

    BsonClassMap.RegisterClassMap<Claim>(cm =>
    {
        cm.SetIgnoreExtraElements(true);
        cm.MapMember(c => c.Issuer);
        cm.MapMember(c => c.OriginalIssuer);
        cm.MapMember(c => c.Properties);
        cm.MapMember(c => c.Subject);
        cm.MapMember(c => c.Type);
        cm.MapMember(c => c.Value);
        cm.MapMember(c => c.ValueType);
        cm.MapCreator(c => new Claim(c.Type, c.Value, c.ValueType, c.Issuer, c.OriginalIssuer, c.Subject));
    });