IdentityServer3 - 客户端证书验证

时间:2018-05-04 21:39:37

标签: asp.net oauth-2.0 openid-connect identityserver3

我有IdentityServer3,我尝试将原始样本WebHost (minimal)作为服务器运行,Console Client Credentials Flow using Certificate作为客户端运行,因为我想测试客户端是否可以通过使用a来验证IdS3 X509 Thumbprint而不是共享密钥来获取访问令牌。

我遇到的问题是我收到了错误回复:invalid_client。 显然,这是因为IdS3没有收到传入请求的证书,所以它认为令牌请求无效(我通过添加自定义SecretParser并检查{{1}进行了测试}}参数,并且没有environmentssl.ClientCertificate用于解析它。)

我只是将两个不同的Visual Studio实例中的两个项目都运行到IIS Express中而不修改项目中的任何其他内容。在这件事上我有什么遗漏吗?为了使这项工作,我还需要设置什么?

1 个答案:

答案 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")
                    }
            },