IdentityServer 3返回invalid_client

时间:2018-12-21 18:44:25

标签: oauth-2.0 access-token identityserver4 openid-connect identityserver3

我正在将IdentityServer3与EF一起使用。我有API项目,我想使用access token验证其访问权限。 因此,基于sample,我在身份服务器中如下配置了客户端(用于API项目)

客户端属性

enter image description here

客户秘密 (请注意,无论我输入什么文本作为秘密值,管理界面都会自动将其转换)

enter image description here

范围 enter image description here

然后使用POSTMAN,我尝试获取访问令牌,但我总是遇到invalid_client错误 enter image description here

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

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

        return client.RequestClientCredentialsAsync("api").Result;
    }

更新1
这是我在身份服务器日志中看到的内容

2018-12-21 19:29:59.284 +00:00 [信息]启动令牌请求
2018-12-21 19:29:59.301 +00:00 [Debug]开始客户端验证
2018-12-21 19:29:59.302 +00:00 [Debug]开始解析基本身份验证机密
2018-12-21 19:29:59.302 +00:00 [Debug]开始解析帖子正文中的秘密
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 [Debug]跳过机密:无描述,机密不是SharedSecret类型的
2018-12-21 19:29:59.943 +00:00 [Debug]找不到匹配的哈希秘密。
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 [信息]返回错误:invalid_client

更新2
(秘密值比我之前发布的值更新了) enter image description here

2 个答案:

答案 0 :(得分:1)

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

  • SharedSecret
  • X509缩略图
  • X509Name
  • X509CertificateBase64

Taken from Identity Server 3 source

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

答案 1 :(得分:0)

在另一种非常奇怪的情况下,您可能会遇到invalid_client错误。

将IdentityServer3.EntityFramework(IS3.EF)更新到2.5.1似乎会导致客户端密钥和作用域密钥的默认行为发生变化。在此版本以下,即使您不为数据库中的机密类型提供值(将其保留为空),Identity Server也会将其视为“ SharedSecret”。它在应用程序级别在类的构造函数中进行设置。

但是,更新的IS.EF3程序包包含AutoMapper到5.0版本的更新。此更新的副作用似乎是停止执行默认构造函数(具有给定的配置)。实际上,在数据库中设置客户端机密类型的这种方式变得必不可少。否则,您会收到invalid_client错误,因为机密与它们的类型不匹配。

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

ID3.EF - idea_for_setting_defaults_on_entities

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