удостоверение server4 получает ошибку «invalid_grant» для конечной точки подключения / токена при развертывании в производство - PullRequest
0 голосов
/ 19 января 2019

Я использую 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, недействителен?

1 Ответ

0 голосов
/ 23 января 2019

После включения журнала, проблема keyset does not exist Приложение не имеет разрешения на чтение закрытого ключа в сертификате. После добавления разрешения проблема решена. Начальная invalid_grant настолько обманчива ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...