我正在尝试实施授权和身份验证服务,以使用 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中检索访问令牌:
在我尝试使用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中的授予类型,据我了解,授权代码和隐式授予类型之间的区别仅在于结果访问令牌的内容。无论如何,在我看来,这里的问题似乎不像是支持第三方身份验证提供程序的问题。但是也许我误会了一些东西。
欢迎提出任何建议。