На самом деле это выглядит как очень странное поведение OpenIddictAuthorizationManager
, в частности PopulateAsync
, функция :
await Store.SetApplicationIdAsync(authorization, descriptor.ApplicationId, cancellationToken);
await Store.SetScopesAsync(authorization, ImmutableArray.CreateRange(descriptor.Scopes), cancellationToken);
await Store.SetStatusAsync(authorization, descriptor.Status, cancellationToken);
await Store.SetSubjectAsync(authorization, descriptor.Subject, cancellationToken);
await Store.SetTypeAsync(authorization, descriptor.Type, cancellationToken);
, она заполняет все, кроме свойств. Итак, вот что я сделал, чтобы сохранить свойства в базе данных. Сначала я добавил нужные мне свойства на этапе авторизации /connect/authorize
:
var ticket = new AuthenticationTicket(
principal,
new AuthenticationProperties(new Dictionary<string, string>{ { "name", "value" } }),
OpenIddictServerDefaults.AuthenticationScheme);
, а затем, как предложено в ответе выше, я создал свой собственный крошечный менеджер аутентификации:
public class AuthorizationManager<TAuthorization>: OpenIddictAuthorizationManager<TAuthorization> where TAuthorization : OpenIddict.MongoDb.Models.OpenIddictAuthorization
{
public AuthorizationManager(...): base(cache, resolver, logger, options)
{
}
public async override Task PopulateAsync(
[NotNull] TAuthorization authorization,
[NotNull] OpenIddictAuthorizationDescriptor descriptor,
CancellationToken cancellationToken = default)
{
await base.PopulateAsync(authorization, descriptor, cancellationToken);
if (descriptor.Properties.Any())
{
authorization.Properties = new MongoDB.Bson.BsonDocument(
descriptor.Properties.Where(p => p.Key[0] != '.') // skip scopes and other technical fields
.Select(p => new MongoDB.Bson.BsonElement(p.Key, p.Value))
);
}
}
}
, где я заполнил все свойства. И, наконец, я только что включил моего менеджера:
options.ReplaceAuthorizationManager<Services.OpenId.AuthorizationManager<OpenIddictAuthorization>>();