HTTPS経由のWCFサービスのみ

私はWindows Server 2008 R2サーバーでホストしたいRESTfulなWCFサービスを持っています。現在、既存のウェブサイト内でアプリケーションとしてホストされています。ポート443には自己署名証明書が使用されています。

サービスをHTTPS経由でのみ提供したいと思います。アプリケーションのSSL設定では、「SSLを要求する」に設定しました。エンドポイントの設定は次のとおりです。

  

  
    
      
    
  
  

    
      
    
  




  

    
  

しかし、ブラウザ(例えば、 https://example.com/myservices/baz-service/yip-resource )を介してサービスにアクセスしようとすると、403回の応答を受け取っています。

設定中に何かを忘れましたか?

2
最初のアクセスはブラウザ経由で行われています。私はエンドポイントの設定を追加しました。
追加された 著者 Bullines,
どのようにサービスにアクセスしようとしていますか?ブラウザまたはwcfプロキシから?
追加された 著者 BNL,
あなたのsvcのためにバインディング/エンドポイントの設定はどのように見えるのですか?
追加された 著者 Nick Nieslanik,

2 答え

IISで「SSLを要求する」オプションを設定すると、クライアント証明書を使用して認証を実行していることを意味します。クライアント証明書認証がない場合は、そのオプションを無視または無効にするだけです。

あなたのサービスがHTTPS上でのみ提供されるのを避けるには、あなたのウェブサイトの "バインディング"オプションからHTTPバインディングを削除してください。そうでなければ、バインディングをセキュリティメカニズムとしてトランスポートを使用するように公開し、HTTPS上でのみサービスされるWCFサービスを処理する必要があります。

更新:

私がHttpsでIIS上でホストされているRESTfulなサービスをどのように持っているかを見つけてください:

[ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class RestService
    {
       //TODO: Implement the collection resource that will contain the SampleItem instances

        private static List sampleCollection = new List();

        [WebGet(UriTemplate = "/get-Collection")]
        public List GetCollection()
        {
           //TODO: Replace the current implementation to return a collection of SampleItem instances
            if (sampleCollection.Count == 0)
            {
                sampleCollection = new List();
                sampleCollection.Add(new SampleItem() { Id = 1, StringValue = "Hello 1" });
                sampleCollection.Add(new SampleItem() { Id = 2, StringValue = "Hello 2" });
                sampleCollection.Add(new SampleItem() { Id = 3, StringValue = "Hello 3" });
                sampleCollection.Add(new SampleItem() { Id = 4, StringValue = "Hello 4" });
                sampleCollection.Add(new SampleItem() { Id = 5, StringValue = "Hello 5" });
            }
            return sampleCollection;
        }
}

私のGlobal.asax:

public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes();
        }

        private void RegisterRoutes()
        {
           //Edit the base address of Service1 by replacing the "Service1" string below
            RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(RestService)));
        }
    }

私のweb.configファイル:

<?xml version="1.0" encoding="UTF-8"?>



  
    
  

  
    
      
    
  

  
    
      
      
    
    
    
      
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the  element below
        -->
                  
                    
        
      
    
    
        
            
                
                    
                
            
        
    
  

今私のIISは指定されたHttpsバインディングを持っています:

Site Bindings in IIS

今私の仮想ディレクトリはXmlRestServiceという名前で設定されているので、リソースを参照すると以下の出力が得られます:

Output from a REST Service on HTTPS

2
追加された
現在、「クライアント証明書」を「無視」に設定しています。
追加された 著者 Bullines,
そのstandardEndpointを使用すると、次のようになります。バインディングWebHttpBindingを持つエンドポイントのスキームhttpに一致するベースアドレスを見つけることができませんでした。登録ベースアドレス方式は[https]です。
追加された 著者 Bullines,
readerQuotasセクションは必要ありませんが、大量のデータを送信する必要がある場合は、それを残しておく方が良いでしょう。
追加された 著者 Rajesh,
私は答えを更新して、あなたは上記を試すことができます
追加された 著者 Rajesh,
私が投稿した私のサンプルアプリケーションは、HTTPSを使ってRESTベースのWCFサービスから情報を取得しています。
追加された 著者 Rajesh,

WCFを実装するには、さまざまな方法があります。多くの人のようにこの答えは私にとってはうまくいきませんでした。私は次の簡単な解決策を思いつきました。私はそれがおそらく最も普遍的な簡単な解決策だと思う。これは雄弁には見えないかもしれませんが、私たちの仕事の中ではそれほど評価されていない大部分の人にとっては、エラーを投げるのではなく、少なくともGET要求のためにリダイレクトを試みることができます。

#if !DEBUG
   //check secure connection, raise error if not secure 
    IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest;
    if (!request.UriTemplateMatch.BaseUri.AbsoluteUri.StartsWith("https://"))
    {
        throw new WebProtocolException(HttpStatusCode.BadRequest, "Https is required to use this service.", null);
    }
#endif
0
追加された