5

ASP.NET Core 5 с ASP.NET Identity 3.0, я использую как веб-страницы, так и apis. Я использую OpenIddict для выдачи маркера JWT и для аутентификации. Мой код выглядит так:Авторизовать через токен JWT

X509Certificate2 c = new X509Certificate2(@"tokensign.p12", "MyCertificatePassword"); 

    services.AddOpenIddict<WebUser, IdentityRole<int>, WebDbContext, int>() 
     .EnableTokenEndpoint("/api/customauth/login") 
     .AllowPasswordFlow() 
     .UseJsonWebTokens() 
     .AddSigningCertificate(c); 

Если отключить UseJsonWebTokens(), я могу генерировать маркер и авторизации успешно. Однако я не уверен, что мой сертификат проверяет возвращаемые токены.

И когда включено UseJsonWebTokens, я могу выпустить токен JWT в этой конечной точке. Однако я не могу аутентифицировать какой-либо запрос!

Я использую следующий код в конфигурации приложения:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
    { 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true, 
     RequireHttpsMetadata = false, 
     Authority = "http://localhost:60000/", 
     Audience = "http://localhost:60000/", 
    }); 
    app.UseOAuthValidation(); 
    app.UseIdentity(); 
    app.UseOpenIddict(); 
    app.UseMvcWithDefaultRoute(); 
  • Как я могу принудить запрос быть подтвержден с моим сертификатом, чтобы убедиться, что маркер JWT не подделан.
  • Каковы правильные настройки, которые позволят проверить и авторизировать мой токен JWT, учитывая, что, если я не использую JWT, я получаю разрешение успешно.
+0

Пожалуйста, не ставьте теги под вопрос! http://stackoverflow.com/help/tagging – Tseng

ответ

5

Если отключить UseJsonWebTokens(), я могу генерировать маркер и авторизации успешно. Однако я не уверен, что мой сертификат проверяет возвращаемые токены.

В ASOS (рамки сервера OpenID Connect за OpenIddict), есть два различные встроенные механизмы сериализации для создания и защиты лексемы:

  • Один, который использует IdentityModel (библиотека, разработанную Microsoft) и производит стандартные маркеры проверяемые третьими лицами:

маркеры идентификации (JWT по определению) всегда создаются с использованием Тхи и вы можете позвонить UseJsonWebTokens(), чтобы заставить OpenIddict выдавать токены доступа, которые используют один и тот же процесс сериализации.

Сертификат, который вы указываете при вызове AddSigningCertificate(), всегда используется для подписи этих токенов.

  • Один, который использует стек ASP.NET Ядро защиты данных (также разработанный Microsoft):

Этот стек производит исключительно «фирменные» фишки, которые не предназначены для чтения или проверить сторонним, поскольку формат токена не является стандартным и обязательно полагается на симметричное подписание и шифрование.

Это механизм, который мы используем для кодов авторизации и обновления токенов, которые предназначены только для использования самим OpenIddict. Он также используется для токенов доступа, когда вы используете формат токена по умолчанию.

В этом случае сертификат, который вы указываете при вызове AddSigningCertificate(), не используется.

Вместо этого эти токены всегда шифруются стеком защиты данных, используя алгоритм Authenticated Encryption (по умолчанию AES-256-CBC с HMACSHA256), который обеспечивает аутентичность, целостность и конфиденциальность. Для этого два ключа (один для шифрования, один для проверки) выводятся стеком защиты данных из одного из основных ключей, хранящихся в ключевом кольце.

Как я могу принудительно выполнить запрос для проверки с моим сертификатом, чтобы убедиться, что токен JWT не подделан. Каковы правильные настройки, которые позволят проверить и авторизировать мой токен JWT, учитывая, что, если я не использую JWT, я получаю разрешение на успешное использование.

Чтобы ответить на эти вопросы, это поможет, если вы включили ведение журнала и разделили свои трассы.

+1

Что такое ключ подписи, используемый этим стандартом IdentityModel? В случае, если я захочу использовать веб-ферму. – Adam

+1

Ключ подписи - это сертификат X.509, который вы используете (точнее, ключ RSA, который он содержит) – Pinpoint

+1

Что такое ключевое кольцо? Как мы храним в нем мастер-ключ? Требуется ли для этого вызов «AddSigningKey()» во время запуска? –

Смежные вопросы