Пропущенные заявки через веб-токен JWT - PullRequest
1 голос
/ 18 февраля 2020

У меня есть следующий код, который создает токен JWT в основном приложении webapi.

var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
                var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

                var claims = new[] {
                    new Claim(JwtRegisteredClaimNames.Sub, userInfo.Username!=null?userInfo.Username:string.Empty),
                    new Claim(JwtRegisteredClaimNames.Email, userInfo.Email!=null?userInfo.Email:string.Empty),
                    new Claim(JwtRegisteredClaimNames.Jti, userInfo.AccountId!=null?userInfo.AccountId.ToString():Guid.Empty.ToString()),
                    new Claim(JwtRegisteredClaimNames.NameId, userInfo.UserId!=null?userInfo.UserId.ToString():Guid.Empty.ToString()),
                    new Claim(JwtRegisteredClaimNames.UniqueName, userInfo.ClientId!=null?userInfo.ClientId.ToString():Guid.Empty.ToString())
                };

                var token = new JwtSecurityToken(_config["Jwt:Issuer"],
                  _config["Jwt:Issuer"],
                  claims,
                  null,
                  expires: DateTime.Now.AddMinutes(20),
                  signingCredentials: credentials);

                return new JwtSecurityTokenHandler().WriteToken(token);

Однако, когда я пытаюсь вернуть претензии после того, как клиент вызвал конечную точку веб-интерфейса, у меня появляются только следующие претензии. Как видите, претензия "JTI" в порядке, но претензия "UniqueName" отсутствует.

[0]: {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: }
    [1]: {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress: }
    [2]: {jti: f7c5af77-d0c4-4026-9b33-2fe9fbf5ee28}
    [3]: {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: 00000000-0000-0000-0000-000000000000}
    [4]: {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: b34a1b42-df24-42a3-93d7-68e88523602f}
    [5]: {exp: 1581973428}
    [6]: {iss: Test.com}
    [7]: {aud: Test.com}

Что мне нужно сделать, чтобы претензия появилась?

Просто отметить, что утверждение, которое я установил как JwtRegisteredClaimNames.UniqueName, действительно присутствует в утверждениях, но не под этим именем. Его значение задается в элементе

[4]: {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: b34a1b42-df24-42a3-93d7-68e88523602f}

Однако это не возвращается при использовании следующего, поскольку оно равно нулю

identity.FindFirst(JwtRegisteredClaimNames.UniqueName).Value;

1 Ответ

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

Однако это не возвращается при использовании следующего, поскольку оно является нулевым

identity.FindFirst(JwtRegisteredClaimNames.UniqueName).Value;

Чтобы устранить вышеуказанную проблему, вы можете попытаться очистить Карта типов входящих заявок с использованием следующего фрагмента кода в Startup.cs

System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

Результат теста

Установить значение тестирования для JwtRegisteredClaimNames.UniqueName

//just for testing purpose

new Claim(JwtRegisteredClaimNames.UniqueName, "b34a1b42-df24-42a3-93d7-68e88523602f")

Можно получить ожидаемое значение, используя identity.FindFirst(JwtRegisteredClaimNames.UniqueName).Value

enter image description here

...