我有IdentityServer3,我尝试将原始样本WebHost (minimal)
作为服务器运行,Console Client Credentials Flow using Certificate
作为客户端运行,因为我想测试客户端是否可以通过使用a来验证IdS3 X509 Thumbprint而不是共享密钥来获取访问令牌。
我遇到的问题是我收到了错误回复:invalid_client
。
显然,这是因为IdS3没有收到传入请求的证书,所以它认为令牌请求无效(我通过添加自定义SecretParser
并检查{{1}进行了测试}}参数,并且没有environment
值ssl.ClientCertificate
用于解析它。)
我只是将两个不同的Visual Studio实例中的两个项目都运行到IIS Express中而不修改项目中的任何其他内容。在这件事上我有什么遗漏吗?为了使这项工作,我还需要设置什么?
答案 0 :(得分:0)
您需要做的第一件事是在IIS Express中启用客户端证书。
您可以通过编辑此文件来执行此操作:
.VS \设置\对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属性中。
这是您需要更改的示例代码: 新客户 { ClientName =&#34;客户端凭据流客户端&#34;, Enabled = true, ClientId =&#34; clientcredentials.client&#34;, 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")
}
},