2011-07-01 108 views
3

我想將對.NET Web服務的訪問限制爲特定的客戶端列表。他們會將他們的客戶證書附加到他們的每一個請求上,只有在「名單上」時才能得到適當的迴應。使用客戶端證書身份驗證創建.NET Web服務

但是如何以及在哪裏最好的實現呢?

在IIS(7.0)上,我可以設置require客戶端證書選項,但是我在哪裏指定允許我訪問哪些客戶端證書?我需要Web服務器機器的證書存儲中的客戶端證書的公共部分嗎?

或者必須像這樣的設置在代碼中處理,我以某種方式提取客戶端證書ID並將其匹配到本地列表?

或者換個方式嗎?

回答

3

一種方法列表如下。

爲了舉辦您可能需要您的Web服務器上運行以下命令WCF服務:

"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r –y 

在IIS設置您的網站使用https綁定(只),並在SSL設置您將其設置爲需要SSL並需要客戶端證書。

僅此一項僅允許使用有效的客戶端證書和Web服務器信任的頒發者訪問您的服務(和wsdl)。

爲了限制訪問你可以設置你的WCF的配置文件與bindingConfiguration具體證書:

<basicHttpBinding> 
    <binding name="MyBasicHttpBinding"> 
    <security mode="Transport"> 
     <transport clientCredentialType="Certificate" /> 
    </security> 
    </binding> 
</basicHttpBinding> 

而且具有自定義證書驗證作爲behaviorConfiguration:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     <serviceCredentials> 
     <clientCertificate> 
      <authentication certificateValidationMode="Custom" 
      customCertificateValidatorType="<project-namespace>.ClientCertificateValidator, <project-namespace>"/> 
     </clientCertificate> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

最後一點將項目中的新類自定義驗證器實現爲:

public class ClientCertificateValidator : X509CertificateValidator 
{ 
    public override void Validate(X509Certificate2 certificate) 
    { 
     if (certificate.Thumbprint != <allowed-thumbprint>) 
     throw new Exception(); 
    } 
} 
1

如果這些客戶端證書來源於特定的根CA,則可以有條不紊地使用CTL

否則,我認爲你有這些選項(根據您的需要):

  • 如果您有機會獲得客戶端證書.CER文件,你可以使用client certificate mapping並映射到Windows帳戶,optinally將他們分組到AD /本地組和相應的權限。
  • 提取UPN代碼(也許在HTTP處理程序),並驗證反對授予UPN的打造上IIS7 WCF服務與您的安全要求
相關問題