尝试使用第三方身份提供者和授权代码授予从IdentityServer获取访问令牌时,授予无效

时间:2018-09-26 20:22:04

标签: google-oauth identityserver4 asp.net-core-2.1

我正在尝试实施授权和身份验证服务,以使用 Google + 身份服务和内部用户名/密码身份验证来支持用户登录。作为一个平台,我决定使用 IdentityServer4 ASP.NET Core 2.1 。起点是IdentityServer and 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+和用户名/密码)。

但是现在,我想获取访问令牌并通过 Postman 在测试API客户端中使用它。对于这种情况,我试图像这样在Postman中检索访问令牌:

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中的授予类型,据我了解,授权代码隐式授予类型之间的区别仅在于结果访问令牌的内容。无论如何,在我看来,这里的问题似乎不像是支持第三方身份验证提供程序的问题。但是也许我误会了一些东西。

欢迎提出任何建议。

0 个答案:

没有答案