[英]IdentityServer3 - Client certificate validation
我有 IdentityServer3 并且我正在尝试运行他们的原始示例WebHost (minimal)
作为服务器和Console Client Credentials Flow using Certificate
作为客户端,因为我想测试客户端可以通过使用 X509 指纹而不是共享密钥以获取访问令牌。
我遇到的问题是我收到错误响应: invalid_client
。 显然,这是因为 IdS3 没有收到传入请求的证书,所以它认为令牌请求无效(我通过添加自定义SecretParser
并检查environment
参数来测试这一点,并且没有ssl.ClientCertificate
值是一个X509CertificateSecretParser
用于解析它)。
我只是将两个不同的 Visual Studio 实例中的两个项目运行到 IIS Express 中,而不修改项目中的任何其他内容。 在这件事上我有什么遗漏吗? 为了使这项工作正常,我还需要设置什么?
您需要做的第一件事是在 IIS Express 中启用客户端证书。
您可以通过编辑此文件来执行此操作:
.vs\\config\\applicationhost.config
改变
<access sslFlags="None" />
到
<access sslFlags="Ssl, SslNegotiateCert" />
现在 IIS Express 支持客户端证书,但它也会检查证书是否受信任。
示例证书 Client.pfx 将无法开箱即用。
您可以让 Windows 信任此证书的颁发者(不推荐),也可以使用如下代码从证书存储区加载现有证书:
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
string thumb = "<thumbprint>";
X509Certificate2Collection cers = store.Certificates.Find(X509FindType.FindByThumbprint, thumb, false);
X509Certificate2 cert = null;
if (cers.Count > 0)
{
cert = cers[0];
}
store.Close();
您还需要将此证书的指纹放入 Identity Server 客户端列表中的 ClientSecret 属性中。
这是您需要更改的示例代码:
new Client
{
ClientName = "Client Credentials Flow Client",
Enabled = true,
ClientId = "clientcredentials.client",
Flow = Flows.ClientCredentials,
ClientSecrets = new List<Secret>
{
new Secret("secret".Sha256()),
new Secret
{
Value = "<your thumbprint here>",
Type = Constants.SecretTypes.X509CertificateThumbprint,
Description = "Client Certificate"
},
},
AllowedScopes = new List<string>
{
"read",
"write"
},
Claims = new List<Claim>
{
new Claim("location", "datacenter")
}
},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.