layout: docs-default
密钥
密钥是机器(客户端或者作用域)得到IdentityServer授权的关键。
客户端密钥定义的例子:
var client = new Client
{
ClientName = "Client Credentials Flow Client",
ClientId = "client",
ClientSecrets = new List<Secret>
{
new Secret("secret".Sha256())
},
Flow = Flows.ClientCredentials
};
作用域密钥定义的例子:
var scope = new Scope
{
Name = "api1",
DisplayName = "Our API",
Type = ScopeType.Resource,
ScopeSecrets = new List<Secret>
{
new Secret("secret".Sha256())
}
};
上面的代码片段设置了一个共享的密钥值secret
,并且用SHA256哈希处理。ClientSecret
属性是一个列表,说明客户端可以又多个密钥,这是为了适应密钥轮换使用的场景。
让我们仔细了解Secret
类的细节吧:
-
Value
密钥的值,这个会被密钥验证器解释处理。(比如,类似于密码的共享密钥,或者其它用来标识凭据的东西。) -
Description
密钥的描述信息,用于附加一些信息到密钥上。 -
Expiration
密钥过期的时刻 -
Type
告诉密钥验证器,密钥的类型(比如:共享密钥,或者X590Certificate指纹)
密码提取
客户端有很多方法来传送密钥--OAuth2规范提到用HTTP基础认证或者使用Post的方法。IdentityServer还增加了X.590客户端证书的方法(详看 这里).
如果需要其它的方式来传送密钥,密钥提取(Parser)是一个扩展点。除了上面提到的方式,还可以实现一个ISecretParser
接口,把实现类加到服务工厂的SecretParsers
集合中。
密钥验证
密钥从请求中提取后,它必须被验证。
默认我们支持共享密钥使用SHA256或者SHA512的哈希值和X.509证书(默认使用证书指纹来验证调用方).
密钥验证也是一个扩展点--如果需要支持其它的验证方法,比如:X.509证书带有链式或者同行信任的可区分名。可以实现ISecretValidator
接口,然后把实现加入到服务工厂的SecretValidators
集合。