0

basicHttpBinding を使用する WCF サービスがあります。ここで、誰もプロキシを作成してメソッドを使用できないように、メソッドを保護したいと考えています。msdn の WCF クライアント証明書を使用しました。しかし、それ以上動けません。ここに私のweb.configがあります

 <system.serviceModel>
<client>
  <endpoint address="http://localhost:57246/Service1.svc" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
    name="BasicHttpBinding_IService1" />
</client>
<services>
  <service name="Microsoft.ServiceModel.Samples.CalculatorService"
           behaviorConfiguration="DataServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:57246/Service1.svc"/>
      </baseAddresses>
    </host>
    <endpoint address=""
       binding="basicHttpBinding"
       bindingConfiguration="Binding1"
       contract="ServiceReference1.IService1" />

    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>
</services>

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService1">
      <security mode="Message">
        <transport realm="" />
        <message clientCredentialType="Certificate" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>


<behaviors>
  <serviceBehaviors>
    <behavior name="DataServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />

      <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        <clientCertificate>

          <authentication certificateValidationMode="PeerOrChainTrust" />
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

今、C シャープからコール フォームを渡す必要があります。showGrid という名前の WCF のメソッドがあります。

public DataSet showGrid()
    {
        SqlDataAdapter da = new SqlDataAdapter("Select * FROM Resources", con);
        DataSet ds = new DataSet();
        da.Fill(ds);
        return ds;
    }

ボタンのクリックでこのように呼び出そうとしています

protected void btnShow_Click(object sender, EventArgs e)
    {
        var client = new ServiceReference1.Service1Client();


 client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "localhost");
        client.showGrid();
        GridView1.DataSource = client.showGrid();
        GridView1.DataBind();
    }

今、1つの例外はこのように投げています

次の検索基準を使用して X.509 証明書を見つけることができません: StoreName 'My'、StoreLocation 'CurrentUser'、FindType 'FindBySubjectName'、FindValue 'localhost'。

これを克服する方法。私を助けてください。私もググってみました。Windows 7 を使用していますが、これはメソッドを保護する正しい方法ですか? 私を案内してください。この問題を何日も探しています。

4

1 に答える 1

1

このようにクライアント証明書を追加するだけです

client.ClientCredentials.ClientCertificate.Certificate = yourcert;

編集:

        X509Certificate2 yourcert= null; 
        var store = new X509Store(storeName, storeLocation);

        store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
        var certCollection = store.Certificates.Find(findType, thumbprint, false);
        if (certCollection.Count>0)
            yourcert= certCollection[0];
        store.Close();
于 2012-11-17T10:12:52.927 に答える