2011-12-19 4 views
0

私はIDispatchMessageInspectorを私のWCFサービスに実装して、以下のようなセキュリティを提供しています。WCFサービスでセキュリティを実装して、選択したクライアントだけが(各メソッドのuserid/passworkをチェックせずに)自分のサービスにアクセスできるようにする方法はありますか?

クライアント側コード:

private class mySecurityInspector : IClientMessageInspector, IDispatchMessageInspector 
    { 
    private const string HEADER_NS = "urn:myservice:authentication-header:2011"; 

    public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
    MessageHeader<string> messageHeader = new MessageHeader<string> 
           (getAuthKeyFromConfig(), false, string.Empty, false); 

    // add the new header to our request 
    request.Headers.Add(messageHeader.GetUntypedHeader("",     
                HEADER_NS)); 
     return null; 
    } 

}

サーバー側(サービス):

private class mySecurityInspector: IDispatchMessageInspector 
{ 
    private const string HEADER_NS = "urn:myservice:authentication-header:2011"; 

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,  
     System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext    
       instanceContext) 
    { 

      string authKey = request.Headers.GetHeader<string>(“”, HEADER_NS); 
      if (authKey != getAuthKeyFromConfig()) 
      { 
       throw new 
       Exception(string.Format(ServiceMessages.MSG_UNAUTHORISED_CLIENT, 
      ""); 
    } 

}

}

この方法では、authkeyを知っているクライアントは私のサービスにアクセスできます。これは私がやったことです。どういうわけか、ある人がハックすれば、セキュリティについては分かりません ネットワークワイヤーに向かう石鹸からのこのauthkeyが私のサービスにアクセスできるようになります。このシナリオで私のサービスを保護する方法は?選択したクライアントのみが自分のサービスにアクセスできるように、私にソリューションを提供してください。

答えて

1

シナリオの解決方法はHTTPSです。あなたは誰かが安全なチャンネルを持っている必要があり、セキュアなチャンネルを取得するための最も簡単な方法がHTTPSを使用することが必要な場合、誰かがauthkeyを盗んでしまう恐れがあります。

質問のタイトルでpassword/useridを記述した理由はわかりませんが、この認証ヘッダーを正常に認証されたクライアントにのみ使用すると、おそらくホイールを再開発している可能性があります。 WCFはすでにこのシナリオをサポートしています。 SecurityContext(またはセキュリティセッション)と呼ばれ、Messageセキュリティモデルの場合はWSHttpBindingで、クライアントクレデンシャルタイプの場合はUserNameが使用されます。クレデンシャルは最初の要求でのみ検証され、その後、クライアントは全期間有効なセキュリティトークンを送信します。セッション。不利な点は、通信状態を完全にすることです。

+0

私はWSHttpBindingを使用すると、古典的なASPアプリケーションは私のサービスを消費することができるでしょうか?私は確信していないので、私はbasicHttpBindingを使用しています。理由は、クライアントアプリケーションが自動的に設定ファイルから、または他の永続的なレイヤーとサービスからピックアップのauthkeyを有効にして、それを検証し、それに応じてアクションを実行するようにしたいということです。>>> –

+0

いいえ。クラシックASPからサービスを呼び出す必要がある場合は、WSHttpBindingを使用しないでください。あなたのauthkeyを理解しているので、それはユーザー名とパスワードと同じです。あなたは、組み込みであり正確に同じ方法で動作するユーザー名パスワード機能を置き換えるカスタムソリューションを開発しました。 –

関連する問題