Я могу пройти аутентификацию в своем веб-API ASP.NET Core 2.2 с помощью JWT, но свойство Name для Identity равно null.
Хотя претензия есть.
Вот JWT, который разложен:
{
"id": "1-A",
"name": "Pure Krome",
"email": "<snip>",
"picture": "https://<snip>",
"locale": "en-au",
"permissions": [
<snip>
],
"iss": "<snip>",
"sub": "google-oauth2|<snip>",
"aud": "<snip>",
"exp": 1597609078,
"iat": 1496325742
}
и вот что видит сервер:
также .. кажется, что он «признает» мою претензию по электронной почте? (примечание: я только что запутал реальное значение электронной почты)
Поэтому я подумал, что name не является общепризнанным заявлением ... поэтому я попытался посмотреть, есть ли для этого какие-то стандартные правила, и нашел У IANA есть список зарезервированных и пользовательских утверждений.. name является первым для пользовательских претензий.
Есть ли какой-то трюк, который мне нужно сделать, чтобы система безопасности ASP.NET Core распознала мою name претензию как NameClaimType ?
Почему претензия email признается?
Вы можете установить NameClaimType в схеме аутентификации через ее настройки проверки AFAIK. Теперь ожидается другой тип заявки.
@juunas >Теперь ожидается другой тип заявки. У вас есть дополнительная информация, чтобы объяснить, что вы предлагаете?
Вы можете установить как: .AddJwtBearer(o => o.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" }). Это изменит утверждение, которое оно использует для заполнения имени.
Хорошо, вау, это сработало @juunas! Опубликуйте это как ответ, пожалуйста. Кроме того, почему это сработало, когда настройки «по умолчанию» не работают? странно, что заявление "электронная почта" найдено, но не имя ??
Существует набор сопоставлений из утверждений JWT в утверждения MS здесь. Как видите, есть отображение из email, но не из name, поэтому одно работает, а другое нет. Вы также увидите, что unique_name — это то, что сопоставлено с более подробной версией утверждения name.
@KirkLarkin, вау! это отличная находка! И... какого черта этот класс JWT находится в репозитории ActiveDirectory? о ничего себе ... есть так много конкретных требований AD: / Наконец, является ли unique_name общим соглашением об именах для этого утверждения? или чаще используется утверждение name? Этот документ где-нибудь есть? Я думал, что мой документ IANA (iana.org/assignments/jwt/jwt.xhtml) был предложенным стандартом... который, как я думал, будет обычным способом?
Также обратите внимание, @KirkLarkin, что вы предоставили ссылку на SYSTEM.IdentityModel.Tokens.Jwt .. которую я не использую. Я использую MICROSOFT.IdentityModel.Tokens.
Я не знаю, почему это unique_name, но я видел name только "в дикой природе". Вокруг всего этого много истории и наследия. Эта проблема GitHub может пролить свет на это. Хотя это может сбивать с толку, ссылка на исходный код, которую я разместил, верна, если вы используете AddJwtBearer. Вы можете убедиться в этом, следуя исходному коду и его цепочке зависимостей. Я не могу объяснить все это в комментарии, и у вас уже есть правильный ответ. :)





Он ожидает другого типа претензии, чем то, что у вас есть. Вы можете установить как:
.AddJwtBearer(o => o.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name"
})
Это изменит утверждение, которое оно использует для заполнения имени.
Не вчитываясь во все подробности (сейчас не так много времени), я вспоминаю более старый случай: stackoverflow.com/questions/41830898/…, помогает ли это?