Azure 当值未硬编码时,api管理客户端证书身份验证失败

Azure 当值未硬编码时,api管理客户端证书身份验证失败,azure,certificate,client-certificates,azure-api-management,Azure,Certificate,Client Certificates,Azure Api Management,我正在API管理组件上设置客户端身份验证。我希望客户端在访问任何API之前先向我的API管理进行身份验证(因此,API管理是服务器,API用户是客户端,而不是后端服务的客户端身份验证) 根据微软的说法,我可以做到这一点()。但是,当我尝试根据上载的所有受信任证书验证证书的指纹时,由于客户端证书无效,验证失败。我使用了与Microsoft提供的相同的策略代码: <choose> <when condition="@(context.Request.Certificate

我正在API管理组件上设置客户端身份验证。我希望客户端在访问任何API之前先向我的API管理进行身份验证(因此,API管理是服务器,API用户是客户端,而不是后端服务的客户端身份验证)

根据微软的说法,我可以做到这一点()。但是,当我尝试根据上载的所有受信任证书验证证书的指纹时,由于客户端证书无效,验证失败。我使用了与Microsoft提供的相同的策略代码:

<choose>
    <when condition="@(context.Request.Certificate == null || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

现在,当我使用硬编码的指纹进行检查时,它会成功:

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-thumbprint")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

我将客户端证书上载到CA证书。我无法在API管理的客户端证书中上载它,因为我没有私钥。只有客户端才会有这些证书,并且他们只会发送他们的公共证书,这样我就可以在信任他们时将其上载到API管理实例中


我认为检查所有证书的策略可能是错误的,它可能只检查来自客户端证书的证书。这是正确的吗?如果是这样,是否可以检查我上传到API管理的所有ca证书?

只有将其上传到客户端证书时,这才有效<代码>上下文.Deployment.Certificates是客户端证书集合。我知道这似乎有悖常理,这是因为
context.Deployment.Certificates
的使用目的并非如此。它持有APIM用于向后端验证自身的证书,因此需要提供私钥


如果您没有访问您的客户端证书的私钥,所有这些密钥都是由几个CA /根证书颁发的,请考虑上载CA /根证书并使用CordEx.Reest.QualICAT.Enter来验证该链。因为这不是我想要的。我只希望某些人能够访问API管理,而不是所有拥有CA签署的有效证书的人。您也可以检查证书颁发者。@VitaliyKurokhtin:您能帮我提供“何时”的示例代码吗我希望检查客户端是否提供了与APIM中存在的一个客户端证书id完全匹配的证书??下面是这样的:你找到答案了吗?我也在做同样的事情。但是context.Request.Certificate对我来说总是空的。我正在使用自签名证书,我已上载到CA和客户端证书。@Sappidireddy我必须手动检查APIM策略中的指纹和颁发者。我无法成功使用Microsofts内置的客户端证书,因为您需要您没有的私钥。Context.Request.Certificate是从客户端在请求中发送的证书。如果该值为空,我认为请求有问题,证书没有随请求一起发送。谢谢!,我已经在另一个帖子中发布了我的问题。我在申请中根本没有得到任何证书。我不确定我在这里做错了什么