layout: docs-default
使用X.509证书认证客户端
客户端一般使用共享的密钥来认真(也就是客户端secret),还有一个选择就是用X.509
client 证书.
注册客户端
通过ISecretValidator
接口可以完全控制 映射一个客户端证书到对应的客户端密钥
默认实现是通过证书的指纹来映射合适的客户端。
下面的代码片段用来为客户端注册客户凭据:
var certClient = new Client
{
ClientName = "Client Credentials Flow Client with Client Certificate",
ClientId = "certclient",
ClientSecrets = new List<Secret>
{
new Secret
{
Value = "61B754C541BBCFC6A45A9E9EC5E47D8702B78C29",
Type = Constants.SecretTypes.X509CertificateThumbprint,
}
},
Flow = Flows.ClientCredentials,
AllowedScopes = new List<string>
{
"read",
"write"
},
}
配置主机
我们需要配置主机接受用户端证书,对于IIS,我们需要配置一个Location节来让令牌endpoint接受客户端证书和SSL设置:
<location path="core/connect/token">
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
</security>
</system.webServer>
</location>
备注 默认情况下, SSL设置是被IIS锁定的,需要在代理配置(delegation configuration)设置为可读写。
申请令牌
为了申请令牌,需要把客户端证书提供给HTTP Client并把客户端ID放在post body中。
下面是用IdentityModel OAuth2客户端的例子:
async Task<TokenResponse> RequestTokenAsync()
{
var cert = new X509Certificate2("Client.pfx");
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(cert);
var client = new OAuth2Client(
new Uri("https://identityserver.io/core/connect/token"),
"certclient",
handler);
return await client.RequestClientCredentialsAsync("read write");
}