Identity Server 4 Идентификационные запросы, связанные с областью, но без открытой области - PullRequest
0 голосов
/ 05 июля 2019

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

return new List<IdentityResource>
{
    new IdentityResources.OpenId(),
    new IdentityResources.Profile(),
    new IdentityResource("email", "Email", new [] { "email" })
    //new IdentityResources.Email()  -- This was tried as well, same error.
};

return new List<ApiResource> { new ApiResource("test", "Test") };

Тогда для областей на клиенте это выглядит следующим образом:

AllowedScopes = new List<string>
{
    "openid", "profile", "email", "test"
}

Однако, когда я запрашиваю токен с http://localhost:5000/connect/authorize?Scope=test email, на странице появляются ошибки, и в моих минимумах я вижу

2019-07-05 11: 08: 00.681 -04: 00 [ERR] Недопустимая область: электронная почта
2019-07-05 11: 08: 00.684 -04: 00 [ERR] Ошибка проверки запроса

Я действительно не уверен, где я ошибся. Согласно всем документам и SO сообщениям, которые я нашел, вот как это делается.

РЕДАКТИРОВАТЬ: произошла внутренняя ошибка, которая была упущена из виду и приводила к неправильной передаче List<IdentityResource>. Тем не менее, даже после устранения проблемы все равно возникает проблема с другим сообщением об ошибке:

Идентификационные запросы, связанные с областью действия, но без открытой области

Редактировать 2:

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

/ connect / authorize? Scope = тестирование openid email & response_type = id_token token & nonce = NONCE

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

Ответы [ 3 ]

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

Вы добавляете претензию IdentityResources.Email() в IdentityResource, это означает, что id_token будет содержать информацию электронной почты пользователя.Вы можете декодировать id_token (не токен доступа), используя онлайн-инструмент, такой как https://jwt.io/, чтобы проверить возвращенные претензии.

Вы также можете установить AlwaysIncludeUserClaimsInIdToken в true в конфигурации клиента, чтобы увидетьвключает ли это требование по электронной почте:

new Client
{
    ClientId = "mvc",
    ClientName = "MVC Client",
    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

    ....

    ....
    AlwaysIncludeUserClaimsInIdToken = true,
    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        "api1",
        IdentityServerConstants.StandardScopes.Email,
    },
    AllowOfflineAccess = true
},

Кроме того, существуют различные виды (потоки аутентификации) примеров быстрого запуска IdentityServer 4:

https://github.com/IdentityServer/IdentityServer4/tree/master/samples/Quickstarts

Вы можетеначать настройку клиента / IDS4 на основе примеров кода.

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

Я вижу, что ответ требует некоторого теоретического обоснования.Как вы можете найти в любой фундаментальной работе или оригинальной спецификации , протокол OpenID Connect стал комбинацией OpenId и OAuth.OIdC совместим со вторым, как вы могли видеть во время трансформации вашего запроса.Новым для OIdC является дополнительный идентификационный токен .OAuth вводит access aka bearer token + refresh token , чтобы получить новый access , когда срок действия существующего истекает.Все это касается доступа к API с использованием http-заголовка авторизации на предъявителя.А новый идентификационный токен представляет пользовательский сеанс для приложения, а не API.

Полезная нагрузка для identity_token и access_token в Identity Server 4 управляется двумя отдельными словарями IdentityResources и ApiResources соответственно.К сожалению, вы не можете добавить область видимости одновременно.Но вы можете определить две разные области действия с одной и той же заявкой.Например:

public static IEnumerable<ApiResource> GetApiResources()
{
    return new List<ApiResource>
    {
        new ApiResource
        {
            Name = "test-api",
            Scopes =
            {
                new Scope
                {
                    Name = "test",
                    UserClaims =
                    {
                        JwtClaimTypes.SessionId,
                        JwtClaimTypes.Role,
                        Constants.TenantIdClaimType,
                        JwtClaimTypes.Email,
                        JwtClaimTypes.Locale
                    }
                }
            }
        }
    };
}

public static List<IdentityResource> GetIdentityResources()
{
    // Claims automatically included in OpenId scope
    var openIdScope = new IdentityResources.OpenId();
    openIdScope.UserClaims.Add(JwtClaimTypes.Locale);

    // Available scopes
    return new List<IdentityResource>
    {
        openIdScope,
        new IdentityResources.Profile(),
        new IdentityResources.Email(),
        new IdentityResource(Constants.RolesScopeType, Constants.RolesScopeType,
                    new List<string> {JwtClaimTypes.Role, Constants.TenantIdClaimType})
            {
                Required = true
            }
    };
}

В этом примере мы добавили возможность получать претензию по электронной почте в access_token как часть области действия test и в id_token как часть стандартной области действия email.

Кроме того, мы должны помнить, что id_token оптимизирован по размеру по умолчанию и имеет только требуемые протоколом утверждения в своей полезной нагрузке.Все дополнительные претензии могут быть запрошены дополнительно из Userinfo конечной точки IdP.Чтобы получить все заявки пользователей в id_token, вы можете установить AlwaysIncludeUserClaimsInIdToken=true в конфигурации клиента в IdSrv.

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

Электронная почта является стандартным ресурсом идентификации.

Попробуйте

return new List<IdentityResource>
{
  new IdentityResources.OpenId(),
  new IdentityResources.Profile(),
  new IdentityResources.Email()
}; 

См. документацию

Если вы хотите добавить пользовательский, вы можете найти его здесь

...