Oauth 2.0 IdentityServer 3返回无效的\u客户端

Oauth 2.0 IdentityServer 3返回无效的\u客户端,oauth-2.0,access-token,identityserver4,openid-connect,identityserver3,Oauth 2.0,Access Token,Identityserver4,Openid Connect,Identityserver3,我将IdentityServer3与EF一起使用。我有一个API项目,我想使用访问令牌对其访问进行身份验证。 因此,基于此,我在identity server中配置了客户端(用于API项目),如下所示 客户端属性 客户机密 (注意,无论我把什么文本作为机密值,管理UI都会自动转换它) 范围 然后使用邮递员,我尝试获取访问令牌,但我总是得到无效的\u客户端错误 我也尝试过使用C代码获取访问令牌,但得到了相同的错误 static TokenResponse GetClientToke

我将IdentityServer3与EF一起使用。我有一个API项目,我想使用
访问令牌
对其访问进行身份验证。 因此,基于此,我在identity server中配置了客户端(用于API项目),如下所示

客户端属性

客户机密 (注意,无论我把什么文本作为机密值,管理UI都会自动转换它)

范围

然后使用邮递员,我尝试获取访问令牌,但我总是得到
无效的\u客户端
错误

我也尝试过使用C代码获取访问令牌,但得到了相同的错误

    static TokenResponse GetClientToken()
    {
        var client = new TokenClient(
            "https://xxxxxxxx/connect/token",
            "A0AD7FB8-2881-484F-xxxxxxxxxxxxxxxxxx",
            "a84iThYxAA5eZpkIzt9xxxxxxxxxxxxxxxxxx");

        return client.RequestClientCredentialsAsync("api").Result;
    }
更新1
下面是我在identity server的日志中看到的内容

2018-12-21 19:29:59.284+00:00[信息]启动令牌请求
2018-12-21 19:29:59.301+00:00[调试]启动客户端验证
2018-12-21 19:29:59.302+00:00[调试]开始解析基本身份验证密钥
2018-12-21 19:29:59.302+00:00[调试]开始解析帖子正文中的秘密
2018-12-21 19:29:59.304+00:00[Debug]解析器发现了秘密:“PostBodySecretParser”
2018-12-21 19:29:59.304+00:00[信息]发现机密id:“A0AD7FB8-2881-484F-ABE0-xxxxxxxx”
2018-12-21 19:29:59.943+00:00[调试]跳过机密:无说明,机密不是SharedSecret类型。
2018-12-21 19:29:59.943+00:00[调试]未找到匹配的哈希秘密。
2018-12-21 19:29:59.943+00:00[信息]机密验证程序无法验证机密
2018-12-21 19:29:59.944+00:00[信息]客户端验证失败。
2018-12-21 19:29:59.945+00:00[信息]结束令牌请求
2018-12-21 19:29:59.946+00:00[信息]返回错误:无效的\u客户端

更新2
(机密值比我之前发布的更新)

尝试将机密类型设置为
SharedSecret
而不是
clientsecret
。Identity Server 3具有以下秘密类型:

  • 共享秘密
  • X509指纹
  • X509Name
  • X509CertificateBase64


此外,在发送身份验证请求时,您似乎正在使用机密的哈希值
a84ithyxaa5ezpkizt9xxxxxxxxxxxx
,但是,您需要使用用于创建机密的纯文本值。(
58b9….

在另一种非常奇怪的情况下,您可能会遇到无效的\u客户端错误

将IdentityServer3.EntityFramework(IS3.EF)更新为2.5.1似乎会导致客户端机密和范围机密的默认行为发生更改。在这个版本下,即使您没有为数据库中的secret类型提供值(保留为null),Identity Server也会将其视为“SharedSecret”。它在应用程序级别的类的构造函数中设置它

但是,较新的IS.EF3包包含AutoMapper到5.0版本的更新。此更新的副作用似乎是停止执行默认构造函数(使用给定的配置)。这样,在数据库中设置客户机机密类型实际上是强制性的。否则,将出现无效的\u客户端错误,因为机密与它们的类型不匹配

看起来作者打算修复此行为更改,但分支到目前为止尚未合并到master中:


请注意,已存在Identity Server 4,因此合并可能永远不会发生。

找到的机密id:“A0AD7FB8-2881-484F-ABE0-xxxxxxxx”。这个Guid是客户端id,不是机密的吗?是的,它是客户端id,你可以在客户端属性中看到。我所附的屏幕截图是说,如果C#和Postman都有相同的日志错误,您需要仔细检查保存和检索客户id的位置,因为我猜您已将其与机密id进行了交换。我已验证它们是否正确。我想这和客户的秘密类型有关?客户机密的
类型应该是什么?任何字符串?请尝试将机密类型设置为
SharedSecret
而不是
clientsecret
@LP13。您可以查看数据库中的IdentityServer3并检查ClientSecrets表(或类似的表),其中存储的机密类型是什么?您的日志显示它不是
SharedSecret
类型。同样在您的c#版本中,您正在使用
A84ithyxaa5ezpkizt9xxxxxxxxxxxxxxxx
作为机密值,但是,这是机密的哈希值,您应该使用在添加机密时设置的纯文本值。@LP13确定,看起来不错。现在,只需将请求中发送的客户机机密更新为在散列之前创建它时使用的实际值。您是正确的,我必须使用以纯文本形式输入的机密值,并且类型应为
SharedSecret
。这就解决了
无效的\u客户端
错误。。但是现在我得到了
无效的\u范围
错误。日志显示“客户端无法在客户端凭据流中请求OpenID作用域”是的,这是正确的
client_凭据
flow无法使用OpenID作用域,例如
OpenID电子邮件配置文件
,因此请删除这些作用域。这些作用域适用于
隐式流
授权码
流中存在用户时(也有其他用户)@LP13。此外,请随意加入聊天室。我可以帮你。