Я создал грант на расширение делегирования, как они это делали в документации. (https://identityserver4.readthedocs.io/en/latest/topics/extension_grants.html).
В этом примере они получают личность пользователя из утверждений и возвращают результат проверки гранта следующим образом:
var sub = result.Claims.FirstOrDefault(c => c.Type == "sub").Value;
context.Result = new GrantValidationResult(sub, GrantType);
Моя проблема в том, что у меня не всегда есть субъект, известный как пользователь, когда мне нужно использовать грант делегирования. В моем сценарии у меня есть приложение, которое прослушивает сообщения. Когда приложение получает сообщение, оно вызывает API, используя client_credentials. Затем этот API вызывает вспомогательный API, используя тип предоставления делегирования. Поскольку приложение использует client_credentials, в утверждениях нет «sub».
Я попытался проверить, существует ли «вспомогательное» утверждение, а если нет, установил для объекта GrantValidationResult «волшебный» идентификатор, который IUserStore будет искать, и либо вернет null, либо обновленный пустой TUser. В обоих случаях это заставляет Microsoft.AspNetCore.Identity бомбить дальше по конвейеру.
Как я могу вернуть GrantValidationResult с текущими утверждениями, но не с субъектом, если он не существует?