身份服务器4部署到生产环境时,获取连接/令牌端点的“ invalid_grant”错误

时间:2019-01-18 21:28:24

标签: c# asp.net-core oauth-2.0 identityserver4 identity

我使用Identityserver4实现OAUTH2,并且服务器支持ResourceOwnerPasswordcode流。我使用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的受信任存储中1}}。 (makecert在AWS的命令行中似乎不可用)

我使用了以下命令: RDP

该应用在本地运行查找,但是在生产环境中,我不断收到此“ invalid_grant”错误。 (我使用makecert -pe -ss MY -$ individual -n "CN=cert" -len 2048 -r获取令牌)尽管可以访问Postman端点(我可以在其中输入客户端ID和密码)

流在connect/authorize端点处失败。

错误消息是这样的:

connect/authorize

我知道输入的信息(客户端ID,重定向URL)都是正确的(都可以在本地正常工作),一旦部署到生产环境中,可能会出什么问题?证书在生产中是否不受信任,或者我不能在客户端和资源中使用内存存储?我不认为这是由于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 造成的,因为即使我使用了甚至不需要redirect_url的{​​{1}}流,它仍然无法生产。

注意:如果删除此行password(不将证书传递给Identityserver4),我将得到相同的redirect_url。那么也许从我的开发机导入到AWS的证书无效吗?

2 个答案:

答案 0 :(得分:0)

打开日志后, 问题是keyset does not exist 该应用程序无权读取证书中的私钥。添加权限后,问题解决。 最初的invalid_grant真是令人误解...

答案 1 :(得分:0)

当我以我无限的智慧将 accessToken expiry time 设置为 refreshToken expiry,并且仅在 refresh 过期时要求 access 时遇到了这个问题。