Не возвращается пользовательское «электронное письмо» в качестве претензии (из токена jwt) с сервера идентификации - PullRequest
0 голосов
/ 07 марта 2019

У меня есть клиент на IdentityServer, который позволяет openid, профилю и электронной почте:

  return new[] {
            new Client
            {
                ClientId = "TestWebApp",
                ClientSecrets = new [] { new Secret("TestSecret".Sha256()) },
                AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                AllowedScopes = new List<string>{ StandardScopes.OpenId, StandardScopes.Profile,StandardScopes.Email },
            }
        };

Я также определил следующие ресурсы идентификации,

 public static IEnumerable<IdentityResource> IdentityResources()
    {
        return new IdentityResource[] {
                new IdentityResources.OpenId(),
                new IdentityResources.Profile(),
                new IdentityResources.Email()                
            };
    }

В случае, если претензия отсутствует, я добавляю электронное письмо к заявке пользователя при создании:

 await _userManager.AddClaimAsync(testUser, new Claim("email", user.Username));

Теперь из моего контроллера входа с помощью ResourceOwnerPasswordAndClientCredentials Я отправляю запрос на аутентификацию:

 var client = new OAuth2Client(new Uri("http://localhost:44322/connect/token"), "TestWebApp", "TestSecret");
 var requestResponse = client.RequestAccessTokenUserName(model.Email, model.Password, "openid profile email");

Это отлично работает, и я возвращаю прицелы, но все они пусты.

enter image description here

Ответы [ 3 ]

0 голосов
/ 09 марта 2019

Когда вы используете поток пароля владельца ресурса, вы запрашиваете токен доступа, а не идентификатор.Из-за этого утверждения, связанные с областями, определенными как ресурсы идентификации, не передаются в вашу зарегистрированную реализацию службы профилей при создании токена доступа.Если вы действительно хотите включить электронное письмо в токен доступа, я бы посоветовал вам создать область ресурсов API с «email», определенным как тип заявки.

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

0 голосов
/ 12 июля 2019

Если вы хотите включить утверждения пользователя в токен Id, вы можете установить для AlwaysIncludeUserClaimsInIdToken значение true в конфигурации клиента.

  return new[] {
            new Client
            {
                ClientId = "TestWebApp",
                ClientSecrets = new [] { new Secret("TestSecret".Sha256()) },
                AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                AllowedScopes = new List<string>{ StandardScopes.OpenId, 
                    StandardScopes.Profile,StandardScopes.Email },
                AlwaysIncludeUserClaimsInIdToken = true
            }
        };
0 голосов
/ 07 марта 2019

Вы можете включать заявки пользователей в accesstoken, когда вы указываете эти заявки в областях.Например, для Swagger нам нужно было включить требование имени, если оно доступно, ниже я вычеркнул содержимое того, что должен содержать класс ApiResource.

    {
    "ApiSecrets": [],
    "Scopes": [
        {
            "Name": "SwaggerApi",
            "DisplayName": "SwaggerApi",
            "Description": null,
            "Required": true,
            "Emphasize": false,
            "ShowInDiscoveryDocument": true,
            "UserClaims": ["name","email"]
        }
    ],
    "Enabled": true,
    "Name": "SwaggerApi",
    "DisplayName": "SwaggerApi",
    "Description": null,
    "UserClaims": ["name","email"]
}

Добавьте эту область в разрешенные области регистрации вашего клиента.

Запрос токена доступа.

Если у пользователя есть претензия имени или претензии по электронной почте -> он должен быть добавлен к токену доступа.

Результат токен доступа к контенту

  "idp": "oidc",
  "name": "MyUserName",
  "scope": [
    "openid",
    "profile",
    "SwaggerApi"
  ],
...