【问题标题】:Certificate Information from WCF Service using Transport security mode使用传输安全模式的 WCF 服务的证书信息
【发布时间】:2011-02-24 18:59:58
【问题描述】:

在使用<security mode="Transport> 时,有什么方法可以获取有关在我的 Web 服务方法中使用了哪个客户端证书的信息?我筛选了 OperationContext.Current,但找不到任何明显的东西。

我的服务器配置如下:

  <basicHttpBinding>
    <binding name="SecuredBasicBindingCert">
      <security mode="Transport">
        <message clientCredentialType="Certificate" />
      </security>
    </binding>
  </basicHttpBinding>

我正在与第三方发布/订阅系统合作,该系统不幸地使用 DataPower 进行身份验证。似乎如果我在此配置中使用 WCF,那么我无法收集有关调用者的任何信息(因为实际上没有发送凭据)。

我需要能够在不更改我的配置或要求他们更改有效负载的情况下找出谁在调用我的服务。

【问题讨论】:

  • 我正在考虑通过简单地添加一个唯一的查询字符串来利用端点地址。 QueryString 可以通过((System.ServiceModel.Channels.HttpRequestMessageProperty)System.ServiceModel.OperationContext.Current.IncomingMessageProperties[System.ServiceModel.Channels.HttpRequestMessageProperty.Name]).QueryString 读取

标签: wcf wcf-security ibm-datapower


【解决方案1】:

是的,但它不直观。

首先,确保并从您的服务库中引用 System.IdentityModel 程序集。

现在,在您想了解客户端证书的服务方法中添加类似以下内容:

// Find the certificate ClaimSet associated with the client
foreach (ClaimSet claimSet in OperationContext.Current.ServiceSecurityContext.AuthorizationContext.ClaimSets)
{
    X509CertificateClaimSet certificateClaimSet = claimSet as X509CertificateClaimSet;
    if (certificateClaimSet != null)
    {
        // We found the ClaimSet, now extract the certificate
        X509Certificate2 certificate = certificateClaimSet.X509Certificate;

        // Do something interesting with information contained in the certificate
        Debug.Print("Certificate Subject: " + certificate.Subject);
    }
}

希望这会有所帮助!

【讨论】:

  • 感谢您的回答,但OperationContext.Current.ServiceSecurityContext.AuthorizationContext 为空!也许 IIS 没有向 WCF 提供证书?
  • 或者只有在&lt;security mode="TransportWithMessageCredential"/&gt;时才可用?
  • 我不知道,在自托管场景中使用传输级安全性和 net.tcp 绑定时,它对我们有用。我不知道为什么在你的情况下 AuthorizationContext 会为空。
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2014-06-17
  • 2020-05-26
  • 1970-01-01
  • 2014-06-19
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多