Я пытаюсь внедрить службу авторизации и аутентификации, которая поддерживает вход пользователя с использованием 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 клиента через почтальон .В этом случае я пытаюсь получить токен доступа в Почтальоне следующим образом:
Он работает нормально, пока я не попытаюсь войти в систему с помощью 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, и, как я понимаю, разница между кодом авторизации и неявным типом гранта заключается только в содержимом токена приведенного доступа.В любом случае, проблема здесь не кажется мне проблемой поддержки стороннего поставщика аутентификации.Но, возможно, я что-то неправильно понимаю.
Любые предложения приветствуются.