Выполняет ли IdentityServer4.AccessTokenValidation автоматическое инспектирование информации о пользователе?

Я использую Identity Server для защиты своего API. Я определил ApiResource как это:

return new List<ApiResource> 
        {
            new ApiResource
            {
                Name = "phone.api",
                ApiSecrets={new Secret("secret1".Sha256())},
                Scopes =
                {
                    new Scope()
                    {
                        Name = "phone.api.full_access",
                        DisplayName = "Full access to API"

                    },
                     new Scope
                    {
                        Name = "phone.api.write",
                        DisplayName = "Write and read access to API"
                    },
                    new Scope
                    {
                        Name = "phone.api.read",
                        DisplayName = "Read only access to API"
                    }
                }
                ,UserClaims=new List<string>()
                {
                    "roles",
                   // ClaimTypes.DateOfBirth
                }
            },

И тестовый пользователь, как это:

new TestUser
{
   SubjectId = "1",
   Username = "Billy Admin",
   Password = "password",
   Claims = new List<Claim>()  
   {
      new Claim("roles", "phone.api.admin"),
       new Claim(ClaimTypes.DateOfBirth,new DateTime(1900,10,10).ToString())
   }
 }

API защищен с помощью следующего кода:

services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = Config.AUTHAUTHORITY; //"http://localhost:4000";
                options.ApiName = "phone.api";
                options.ApiSecret = "secret1";
                options.RequireHttpsMetadata = false;
            });

У меня есть вопрос, если, когда client+ access_token (не содержащий утверждение ClaimTypes.DateOfBirth), API автоматически вызовет конечную точку информации пользователя на сервере полномочий для получения дополнительных утверждений. Причина, по которой мне нужны дополнительные утверждения, проверка некоторых политик, таких как:

services.AddAuthorization(options =>
{
     options.AddPolicy("Only21", policy => policy.Requirements.Add(new MinimumAgeRequirement(21)));
} );

Мои тесты показывают, что он не вызывает конечную точку userinfo, и я хочу знать, почему. Должен ли я назвать это по-своему AuthorizationHandler<MinimumAgeRequirement>?

Большое спасибо.

1 ответ

Вопрос Бадулаке интересный: как вы управляете утверждениями API в OAuth-архитектуре таким образом, который действительно лучше всего работает для API?

Это не просто вопрос технологии OAuth - это скорее вопрос разработки расширяемости API. Я обнаружил, что управление данными утверждений в API работает лучше всего, и для обеспечения их эффективности обычно используется кэширование утверждений.

Из интереса, вот пример кода.Net, который реализует вышеупомянутую архитектуру:

Недавно я делал несколько API-интерфейсов AWS без сервера, и было интересно узнать, что шлюз AWS API также использует этот тип подхода.

Другие вопросы по тегам