我正在将IdentityServer3与EF一起使用。我有API项目,我想使用access token
验证其访问权限。
因此,基于sample,我在身份服务器中如下配置了客户端(用于API项目)
客户端属性
客户秘密 (请注意,无论我输入什么文本作为秘密值,管理界面都会自动将其转换)
然后使用POSTMAN,我尝试获取访问令牌,但我总是遇到invalid_client
错误
我也尝试过使用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
答案 0 :(得分:1)
尝试将机密类型设置为SharedSecret
,而不是clientsecret
。 Identity Server 3具有以下秘密类型:
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,因此合并可能永远不会发生。