Недопустимое разрешение при попытке получить токен доступа от IdentityServer с использованием сторонних поставщиков удостоверений и предоставления кода авторизации - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь внедрить службу авторизации и аутентификации, которая поддерживает вход пользователя с использованием Google + сервисов идентификации и внутренней имя пользователя / пароль аутентификация.В качестве платформы я решил использовать IdentityServer4 и ASP.NET Core 2.1 .Начальная точка: IdentityServer и ASP.NET Identity .

Это работает, но для моей цели я хочу получить токен доступа с использованием код авторизации предоставить.Вот мои ресурсы и клиенты:

public static IEnumerable<ApiResource> GetApiResources()
{
    return new List<ApiResource>
    {
        new ApiResource("api1", "My API")
    };
}

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

public static IEnumerable<Client> GetClients(IConfiguration config)
{
    return new Client[]
    {
        new Client
        {
            ClientId = "mvc",
            ClientName = "MVC Client",
            AllowedGrantTypes = GrantTypes.Implicit,

            RedirectUris = {"http://localhost:5002/signin-oidc"},
            PostLogoutRedirectUris = {"http://localhost:5002/signout-callback-oidc"},

            AllowedScopes =
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile
            },

            AllowAccessTokensViaBrowser = true
        },
        new Client
        {
            ClientId = "test_client_auth_code",
            ClientName = "Test Client",
            AllowedGrantTypes = GrantTypes.Code,

            RedirectUris = {"http://localhost:5002"},

            ClientSecrets =
            {
                new Secret("secret".Sha256())
            },

            AlwaysSendClientClaims = true,

            AllowedScopes =
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                IdentityServerConstants.StandardScopes.Email
            },

            AllowAccessTokensViaBrowser = true
        },
        new Client
        {
            ClientId = "test_client_implicit",
            ClientName = "Test Client",
            AllowedGrantTypes = GrantTypes.Implicit,

            RedirectUris = {"http://localhost:5002"},

            AlwaysSendClientClaims = true,

            AllowedScopes =
            {
                "api1"
            },

            AllowAccessTokensViaBrowser = true
        }
    };
}

И я настроил IdentityServer вот так

services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryIdentityResources(IdentityServerConfiguration.GetIdentityResources())
    .AddInMemoryApiResources(IdentityServerConfiguration.GetApiResources())
    .AddInMemoryClients(IdentityServerConfiguration.GetClients(Configuration))
    .AddAspNetIdentity<ApplicationUser>();  

services.AddAuthentication()
    .AddGoogle("Google", options =>
    {
        options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

        options.ClientId = "688724879532-n7ihk29i1brc9guma71ti890m799fia0.apps.googleusercontent.com";
        options.ClientSecret = "RJWt0BYEbbzJKaUIbMKrypOU";
    });

Все остальное тоже самое.

Запуск клиента MVC для тестирования прошел успешно и дал мне возможность использовать все возможные аутентификации (Google+ и имя пользователя / пароль).

Но теперь я хочу получить токен доступа и использовать его втестирование API клиента через почтальон .В этом случае я пытаюсь получить токен доступа в Почтальоне следующим образом:

enter image description here

Он работает нормально, пока я не попытаюсь войти в систему с помощью Google (ввод имени пользователяи пароль работает).В этом случае я получаю ошибку недопустимого предоставления:

POST
http://localhost:5000/connect/token
09:50:12.896
Pretty
Raw
POST /connect/token
content-type: application/x-www-form-urlencoded
user-agent: PostmanRuntime/7.3.0
accept: */*
host: localhost:5000
accept-encoding: gzip, deflate
content-length: 222
grant_type=authorization_codecode=4/ZgBr3c7WuDyG92-wYbibVo5wKd0HWXFUkOGrEkZTMmG7KGM9akRrMt8sqvWDu9D7HkJxExv6n8HjGfJdbpXlWLcredirect_uri=http://localhost:5002client_id=test_client_auth_codeclient_secret=secret
HTTP/1.1 400
status: 400
date: Wed, 26 Sep 2018 19:50:12 GMT
content-type: application/json; charset=UTF-8
server: Kestrel
cache-control: no-store, no-cache, max-age=0
pragma: no-cache
transfer-encoding: chunked
{"error":"invalid_grant"}

И в моем журнале от IdentityServer я вижу this

С другой стороны, когда я пытаюсь получить доступтокен с использованием неявной аутентификации типа предоставления с помощью Google Works.

Я читал о типах грантов в IdentityServer4, и, как я понимаю, разница между кодом авторизации и неявным типом гранта заключается только в содержимом токена приведенного доступа.В любом случае, проблема здесь не кажется мне проблемой поддержки стороннего поставщика аутентификации.Но, возможно, я что-то неправильно понимаю.

Любые предложения приветствуются.

...