web-dev-qa-db-ja.com

HTTP要求は、クライアント認証スキーム「匿名」で禁止されていました。リモートサーバーがエラーを返しました:(403)Forbidden

安全なWebサービスを作成しようとしています。

これが契約とサービスの実装です

[ServiceContract()]
public interface ICalculatorService
{
    [OperationContract()]
    int Add(int x, int y);
}

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public class CalculatorService : ICalculatorService
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

ここにサービスコードがあります

var b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
b.Security.Message.ClientCredentialType = MessageCredentialType.None;

Type contractType = typeof(ICalculatorService);
Type implementedContract = typeof(CalculatorService);
Uri baseAddress = new Uri("https://localhost:8006/CalculatorService");
ServiceHost sh = new ServiceHost(implementedContract);

sh.AddServiceEndpoint(contractType, b, baseAddress);

//ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
//sm.HttpsGetEnabled = true;
//sm.HttpsGetUrl = new Uri("https://localhost:8006/CalculatorServiceMex");
//sh.Description.Behaviors.Add(sm);

sh.Credentials.Peer.PeerAuthentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust;
        sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindBySubjectName, "localhost");

sh.Open();
Console.WriteLine("Service is Listening");
Console.ReadLine();
sh.Close();

ここにクライアントコードがあります

var b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
b.Security.Message.ClientCredentialType = MessageCredentialType.None;

var factory = new ChannelFactory<ICalculatorService>(b);
factory.Credentials.Peer.PeerAuthentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust;
        factory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindBySubjectName, "localhost");

var client = factory.CreateChannel(new EndpointAddress(new Uri("https://localhost:8006/CalculatorService")));

ServicePointManager.ServerCertificateValidationCallback =
   ((sender, certificate, chain, sslPolicyErrors) =>
            {
                return true;
            });

ICommunicationObject comObject = client as ICommunicationObject;
int result = -1;
try
{
  comObject.Open();
  result = client.Add(10, 2);
}
catch (Exception ex)
{

}
Console.WriteLine(string.Format("Service say 10 + 2 = {0}", -1));
Console.ReadLine();

サービスは正常に実行され、ServicePointManager.ServerCertificateValidationCallbackチェックが行われると、ポリシーエラーは発生せず、正しい証明書チェーンが構築されます。

enter image description here

信頼されたルートにCAがあり、TrustedPeopleストアにサーバー/クライアント証明書があります。また、ブラウザからサイトに移動すると、ページが返されます。エラーなしenter image description here

IISが必要だと思うものに更新し、IIS enter image description here

そして、以下のコマンドラインから。 enter image description here

証明書を受け入れるようにSSL設定を設定しました enter image description here

匿名認証を有効にしました。 enter image description here

誰かが私が正しく行っていないステップを知っていますか、何かおかしいと思いますか?同じエラーが発生し続けます"HTTP要求はクライアント認証スキーム '匿名'で禁止されていました。"

11
fanuc_bob

これの別の理由は、ヒットしているサーバー上の証明書自体です。プライベートキーをインポートしたことを確認してください。 In MMCこれは「フレンドリ名」で表示されます。これを理解するには数日かかりました。秘密鍵をインポートすると、匿名エラーはなくなり、すべて順調です。

2
Blake

WCFサービスをIISセキュリティタイプトランスポートおよびクライアントクレデンシャルタイプ証明書でホストする場合、ルートストアにクライアント証明書を置き、IISで匿名認証を有効にしますIISで匿名認証を有効にします。しかし、最も重要なのは、ルートストアに証明書を追加することです。

0
Shubham Sharma

自己ホスト型のWCFサービス(IISなし)を実行する場合、confingファイル(サーバー内)に以下を追加することにより、匿名クライアントを有効にできます。

<behaviors>
    <serviceBehaviors>
        <behavior name="limitedAuthBehavior">
            <serviceAuthenticationManager authenticationSchemes="Anonymous, Basic, Digest, Negotiate"/>
            <!-- ... -->
        </behavior>
    </serviceBehaviors>
</behaviors>

また、clientCredentialTypeを「I​​nheritedFromHost」に設定します。

<bindings>
      <basicHttpBinding>
        <binding name="secureBinding">
          <security mode="Transport">
            <transport clientCredentialType="InheritedFromHost" />
          </security>
        </binding>
      </basicHttpBinding>
</bindings>

参照:

WCFで複数の認証スキームを使用

HTTP認証について

0
uriel

このエラーメッセージがありましたが、解決策は、スクリプトに対してハンドラーマッピング機能のアクセス許可が有効になっていないことでした。これを有効にするには、IIS [ハンドラーマッピング]> [機能のアクセス許可の編集]で、またはScriptノードのaccessPolicy属性にhandlersを追加します。 web.configで:

<system.webServer>
  <handlers accessPolicy="Script">
    ...
  </handlers>
</system.webServer>
0
Tim Iles