Я использую Identityserver4
для реализации OAUTH2
, и сервер поддерживает ResourceOwnerPassword
и code
flow. Я использую AWS EC2 для размещения приложения для производства.
Странно то, что даже приложение отлично работает на моем компьютере разработчика, после развертывания на AWS я продолжаю получать invalid_grant
и не знаю, что идет не так.
Вот мой код:
services.AddIdentityServer()
//.AddDeveloperSigningCredential()
.AddSigningCredential(Certificate.GetCertificate())
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
new Client
{
ClientId = "client",
ClientName = "client",
ClientSecrets =
{
new Secret("secret".Sha256())
},
RequireClientSecret = false,
RedirectUris = new List<string>(new string[] { "https://www.getpostman.com/oauth2/callback", "http://localhost:8002", "http://192.168.1.5:8002","app.buyingagent:/oauthredirect"}),
AllowedGrantTypes = GrantTypes.Code,
//RequirePkce = true,
AllowedScopes = { "api" },
AllowOfflineAccess = true
}
public static X509Certificate2 GetCertificate()
{
using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
{
store.Open(OpenFlags.OpenExistingOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "cert", false);
return certs.Count > 0 ? certs[0] : null;
}
}
Я понимаю, что нехорошо хранить информацию в памяти, но я просто хочу сначала получить подтверждение концепции. Для x509 certificate
, который передается AddSigningCredential
для подписи токена, я создал саморазвивающийся сертификат на своем локальном компьютере, используя makecert
, а затем экспортирую его в доверенное хранилище в AWS через RDP
. (makecert не отображается в командной строке AWS)
Я использовал эту команду:
makecert -pe -ss MY -$ individual -n "CN=cert" -len 2048 -r
Приложение запускается находить локально, но в процессе работы я продолжаю получать эту ошибку "invalid_grant". (Я использую Postman
для получения токена) Я могу посетить конечную точку connect/authorize
, хотя (где я могу ввести идентификатор клиента и пароль)
Поток завершается с ошибкой в connect/authorize
конечной точке.
Сообщение об ошибке выглядит так:
POST http://{url}/connect/token
Request Headers:
undefined:undefined
Request Body:
grant_type:"authorization_code"
code:"7cb58d345975af02332f2b67cb71958ba0a48c391e34edabd0d9dd1500e3f24e"
redirect_uri:"https://www.getpostman.com/oauth2/callback"
client_id:"client"
Response Headers:
undefined:undefined
Response Body:
error:"invalid_grant"
invalid_grant
Error
Я знаю, что введенная информация (идентификатор клиента, URL перенаправления) верна (все работает локально), что может пойти не так, как только будет развернуто в рабочей среде? Сертификат не является доверенным для производства или я не могу использовать встроенное хранилище для клиента и ресурса? Я не думаю, что это происходит из-за redirect_url
, потому что даже если я использую поток password
, который даже не требует redirect_url
, он все равно не работает.
Примечание: если удалить эту строку AddSigningCredential(Certificate.GetCertificate())
(не передавать сертификат для identityserver4), я бы получил то же самое "invalid_grant
. Может быть, сертификат, импортированный с моей машины разработчика в AWS, недействителен?