ユーザー名/パスワード+ SSLを使用してWCFで安全なRESTfulサービスを構成する方法

StackOverflow https://stackoverflow.com/questions/141484

質問

WCFでRESTfulサービスを許可する構成ファイルを作成しようとしていますが、ユーザー名/パスワード認証のためにメンバーシッププロバイダーに「タップ」する機能が必要です。

以下は、basicHttpバインディングまたはwsHttp w / out WS Securityを使用する私の現在の設定の一部です。これはRESTベースのサービスを使用してどのように変更されますか?

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/>
                </security>
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding name="basicHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
役に立ちましたか?

解決 7

更新01/23/2012

この質問を書いてから、WebサービスのようなRESTを野生で保護するためのはるかに優れたアプローチを見てきました。初めて聞いたときは複雑に聞こえましたが、アイデアはシンプルであり、Webサービスと他の安全な通信の両方でWeb全体に使用されます。

公開/秘密鍵の使用が必要です。

1。)エンドポイントの各ユーザー(顧客)は、REST Webサービスに登録する必要があります

  • a。)このユーザーに、共有すべきではない秘密鍵を与える 誰でも
  • b。)また、ネットワーク経由で送信できる公開鍵を生成します 必要に応じてプレーンテキストで(これはクライアントの識別にも使用されます)

2。)ユーザーからの各リクエストは、リクエストに署名するためのハッシュを生成する必要があります

  • a。)この一例は次のようになります。秘密鍵+タイムスタンプ+エンコードされたペイロード(たとえば、更新される単純なユーザー情報のように十分に小さい場合)
  • b。)これら3つ(またはあなたが決めたもの)を取り、1方向ハッシュを生成します(たとえばhmacを使用)
  • c。)ワイヤを介して送信されるリクエストには、公開鍵(サーバー側がこのリクエストを送信しようとしている人を知るため)、秘密鍵で生成されたハッシュ、およびタイムスタンプを含めます。

3。)サーバーエンドポイント(RESTメソッド)は、クライアントで使用されるのと同じ入力を使用してハッシュを生成する必要があります。この手順により、クライアントとサーバーの両方が、要求と共に渡された公開キーと一致する秘密キーを知っていたことが証明されます。 (これは、リクエストを送信したユーザーが秘密鍵を知ることができないため、正当であることを意味します)

  • a。)リクエスト中に渡される公開鍵で顧客の秘密鍵を検索する

  • b。)前のステップで見つけた秘密鍵とともに他のパラメーター(タイムスタンプとエンコードされたペイロード)を取り、同じアルゴリズムを使用して一方向ハッシュを生成します(再びhmacは私が持っているものです)実世界で使用されているように見える)

  • c。)結果の1ウェイハッシュは、400(または「不正なリクエスト」とみなされるhttpコード)を返送しない場合、ネットワーク経由で送信されたハッシュと一致する必要があります

他のヒント

ASP.netメンバーシッププロバイダーでWCF RESTサービスをセキュリティで保護するポッドキャストは次のとおりです。

http:// channel9。 msdn.com/posts/rojacobs/endpointtv-Securing-RESTful-services-with-ASPNET-Membership/

Wrelを介した複雑なRESTシナリオは悪い考えであるとDarrelに同意します。きれいではありません。

ただし、Dominick Baierには、この最も特権の少ないブログで良い投稿があります。

WCFのFormsAuthenticationTicketサポートへのフォールバックを使用したWSSE認証サポートを表示する場合は、 BlogServiceのソースコードを確認してください。

WCF上でRESTを実装するためにこの戦いの道を進む前に、 Tim Ewaldによるこの投稿。特に次の声明の影響を受けました。

  

上に構築したいのかわからない   HTTPを考慮に入れるように設計されたレイヤー   に設計されたレイヤーの上部   因数分解します。

WCFを使用したRESTベースのものの開発に過去12か月を費やしましたが、その声明は何度も何度も真実であることが証明されています。 WHOがテーブルにもたらすものは、REST作業を行うために導入される複雑さよりも重要です。

コミュニティがWCFでRESTに反対する意見を持っているかどうかにかかわらず(私は個人的にフェンスにいます)マイクロソフトはそれをスワイプしました、 http://msdn.microsoft.com/en-us/netframework/cc950529.aspx

はい、Motoに同意しました。WCFスターターキットからのリンクは、カスタムHTTPヘッダー( http://msdn.microsoft.com/en-us/library/dd203052.aspx )。

しかし、私は例を実行することができませんでした。

custombasicauth @ codeplex

をお試しください
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top