Обновление IdentityServer4 до Core 3.1 - токены вдруг не подписаны правильно? - PullRequest
0 голосов
/ 05 февраля 2020

Мы столкнулись с ошибкой при обновлении IdentityServer4 (2.5.3 - 3.1.0) до Core 3.1 (с 2.2). Внезапно выданные токены не имеют правильной подписи. Мы не изменили алгоритм подписи; по-прежнему использует один и тот же .PFX-сертификат между версиями.

var idSrvBuilder = services.AddIdentityServer(opts =>
            {
                opts.Events.RaiseErrorEvents = true;
                opts.Events.RaiseFailureEvents = true;
                opts.Events.RaiseInformationEvents = true;
                opts.Events.RaiseSuccessEvents = true;
                if (_env.IsProduction())
                {
                    opts.PublicOrigin = Configuration["Globals:IdentityURL"];
                }
            }).AddSigningCredential(new X509Certificate2(Configuration["Cert:Path"], Configuration["Cert:Password"]));

При использовании промежуточного программного обеспечения OWIN "UseIdentityServerBearerTokenAuthentication" для более старого API он завершается ошибкой, если ValidationMode равен Local, но не если он проверяется непосредственно на IdentityServer (с ValidationMode ValidationEndpoint). API будет возвращать только «Unauthorized», но работает со старым токеном (тот же сертификат подписывает их!) удаленная полезная нагрузка):

eyJhbGciOiJSUzI1NiIsImtpZCI6IjZCMTM4RUIzMUE4OUExQTdEQTdCNkRGNzMwOTRGMzIzREJFNzhCNjYiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJheE9Pc3hxSm9hZmFlMjMzTUpUekk5dm5pMlkifQ.U3unxhW6act8fQLCLAYBJAZ-lIMiKaghVEUdA3b7iM0mI0UqGmYgYw05SvVXTAT8ZNQPuq0D-97d0Z6VVBC2wH7VAl0daF6sYJyuSUEtDiBPttNQ9MsGBNjcN1HABZ0nv-z_lgG2Z9sgp4blCvc7N8xOsja-kuk6m06I7iOfS7O_YKPtTAXA10OCzdtiJbhYijeTFsBJaWf5-J3XJCtqpp-MGXCboE0gQIlvysKz5_CRaaKYptczw-cTX3sgRIhfWn2VxVujhH7JKeSJan52X-fQ4T47PWuVcWNOrcWheeLAbVDQU1U9DiLVVua3BasnIku5Rx4XcLnqCaokCiWZhg

Со следующим заголовком токена:

{
  "alg": "RS256",
  "kid": "6B138EB31A89A1A7DA7B6DF73094F323DBE78B66",
  "typ": "JWT",
  "x5t": "axOOsxqJoafae233MJTzI9vni2Y"
}

Новый:

eyJhbGciOiJSUzI1NiIsImtpZCI6IjZCMTM4RUIzMUE4OUExQTdEQTdCNkRGNzMwOTRGMzIzREJFNzhCNjYiLCJ0eXAiOiJhdCtqd3QiLCJ4NXQiOiJheE9Pc3hxSm9hZmFlMjMzTUpUekk5dm5pMlkifQ.RmKHRk44c6Ele-VbB8lhNsmmcvKFludaWypuBzQzYqR7AEIuLXAuZ-N4I9ooVvQLHisBJT4qA4epEK9xdtf0ELpcvfEe3Yc2dkJnKp_rjJSRuhqyNHD0hPAoxqVSWHhfaLxLiL7_17mklqLDEqwdXANnA2YCO-Q-9wqGALZorywHYucr0X9m2hYm1oVgXPitG_TAqysYVNnLCHVGZRNE7Xmug0XhkJXzQ8RpZuSHlDHFlT2cgb7psEb4NUfA8v5-q-LyqfPDk4xJZX2ia53SoPpiJbByFgscYF4xk54SkkcB9EOxCCsR-IYHJAmyYkhGRpBVWY5xU_9qb2ioIwkzZg

Со следующим заголовком:

{
  "alg": "RS256",
  "kid": "6B138EB31A89A1A7DA7B6DF73094F323DBE78B66",
  "typ": "at+jwt",
  "x5t": "axOOsxqJoafae233MJTzI9vni2Y"
}

Полагаю, проблема в том, что "typ" из нового токена равно "at+jwt"? Что это обозначает? Я смотрел на выпуски IdentityServers, проблемы с Github, гуглил, искал stackoverflow, но никто, кажется, не заметил таинственный новый "at+jwt" "typ".

Может ли это быть причиной проблемы? Как я могу поручить моей новой версии выпускать стандартную версию JWT? А что это за странный at+jwt?

1 Ответ

1 голос
/ 06 февраля 2020

Спасибо @Ruard van Elburg в комментариях за ссылки на явно напечатанные токены.

Изменение значения по умолчанию "at + jwt" на просто "jwt" решило проблему:

var idSrvBuilder = services.AddIdentityServer(opts =>
            {
                opts.Events.RaiseErrorEvents = true;
                opts.Events.RaiseFailureEvents = true;
                opts.Events.RaiseInformationEvents = true;
                opts.Events.RaiseSuccessEvents = true;
                opts.AccessTokenJwtType = "jwt";
                if (_env.IsProduction())
                {
                    opts.PublicOrigin = Configuration["Globals:IdentityURL"];
                }
            });

Я предполагаю, что основная проблема связана с пакетом IdentityServer3.AccessTokenValidation, который мы используем в этом API не может распознать в + JWT. Мы используем его, чтобы мы могли потенциально поддерживать эталонные токены.

Мы также не можем обновить этот API до ASP Core и использовать более новый IdentityServerAuthenticationExtensions от Microsoft из-за некоторых зависимостей от третьих сторон, которых мы нужно поддерживать. Этот пакет, кажется, в состоянии обработать at+jwt очень хорошо.

РЕДАКТИРОВАТЬ:

Все еще не работал. Посмотрел проблему Github, с которой связывался Руард.

Оказывается, мне также пришлось включить EmitLegacyResourceAudienceClaim, чтобы не выглядело это так:

var idSrvBuilder = services.AddIdentityServer(opts =>
            {
                opts.Events.RaiseErrorEvents = true;
                opts.Events.RaiseFailureEvents = true;
                opts.Events.RaiseInformationEvents = true;
                opts.Events.RaiseSuccessEvents = true;
                opts.AccessTokenJwtType = "JWT";
                opts.EmitLegacyResourceAudienceClaim = true;
                if (_env.IsProduction())
                {
                    opts.PublicOrigin = Configuration["Globals:IdentityURL"];
                }
            })
...