Использовать ключ подписи JwtBearerAuthentication
Я пытаюсь реализовать Аутентификацию на носителе JWT в своем приложении AspNetCore MVC (только для веб-API), используя JwtBearerMiddleware, но получаю 401
ответ с заголовком:
WWW-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found"
Соответствующий код в Startup.cs выглядит так:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = "https://example.okta.com",
Audience = "myClientId"
});
С URL-адресом авторизации я бы ожидал, что промежуточное ПО будет запрашивать мои метаданные провайдера идентификации из https://example.okta.com/.well-known/openid-configuration
чтобы получить jwks_uri
затем получить ключи подписи от https://example.okta.com/oauth2/v1/keys
, Я не думаю, что это происходит. Что мне нужно сделать, чтобы заставить его находить и использовать ключи подписи? Спасибо
1 ответ
После следующих ссылок и копания в репозитории AspNet Security (особенно JwtBearerHandler
а также JwtBearerMiddleware
классы), что привело меня к пространству имен Microsoft.IdentityModel, которое находится в репозитории Azure Extensions (сначала ConfigurationManager<T>
класс, то к OpenIdConnectConfigurationRetriever
учебный класс (GetAsync
метод), то к JsonWebKeySet.GetSigningKeys()
метод), я наконец обнаружил, что JwtBearerMiddleware действительно получает ключи от jwks_uri в метаданных. Уф.
Так почему же это не сработало? Что я должен был проверить ранее, так это то, что ребенок в заголовке Bearer JWT на самом деле не совпадал ни с одним из детей из jwks_uri, следовательно, он не был найден. Это был код доступа, который я отправлял как токен на предъявителя. У id_token, с другой стороны, есть соответствующий ребенок, так что вместо этого это сработало!
С тех пор я прочитал:
Токен доступа OIDC применим только для конечной точки Okta /oauth2/v1/userinfo и поэтому должен рассматриваться приложением как непрозрачный. Приложению не нужно проверять его, так как его не следует использовать против других серверов ресурсов. Формат и ключ, используемый для его подписания, могут быть изменены без предварительного уведомления. источник
... так что я не могу использовать токен доступа.