36

IIS でホストされている RESTful WCF サービスと通信する Windows フォーム アプリの承認/認証を実装するための最良の方法は何ですか?

私が尋ねる理由は、さまざまな方法を表現するさまざまな記事や投稿をふるいにかけ、最終的に WCF セキュリティのベスト プラクティスに関する約 650 ページのドキュメントにたどり着いた後、非常に混乱しているためです」( http://www.codeplex.com/WCFSecurityGuide ) 私は私のシナリオを考えると、どのアプローチを採用するのが最適で、実装を開始する方法がわかりません。

この記事「A Guide to Designing and Building RESTful Web Services with WCF 3.5」( http://msdn.microsoft.com/en-us/library/dd203052.aspx ) と RESTful WCF サービスに関する PDC ビデオから始めました。私にとって初めての REST フレンドリーな WCF サービスを実装するのに役立ちました。

サービスが機能するようになった後、セキュリティの実装に戻りました。「セキュリティに関する考慮事項」(ページの 4 分の 1) を参照し、指示に従って HTTP Authorization ヘッダーを実装しようとしましたが、コードが不完全であることがわかりました (「UserKeys」変数が宣言されていないことを確認してください)。これは、これを行う方法についてさらに調査しようとしたポイントです(「Authorization」HTTPヘッダーでHMACハッシュを使用しましたが、Googleであまり見つけられませんでしたか?)メッセージレベルのセキュリティに関する他の記事にたどり着きました。フォーム認証とカスタムバリデーターを使用していますが、率直に言って、どちらが今取るべき最善かつ最も適切なアプローチであるかはわかりません.

以上のことを踏まえて (そして今まで聞いてくれてありがとう!)、主な質問は次のとおりだと思います。

- どのセキュリティ実装を使用すればよいですか?

- すべての WCF 呼び出しでユーザー名/パスワードを送信しないようにする方法はありますか? 接続が最初に確立されている場合は、これらの余分なバイトを送信しないことをお勧めします。これは、ログイン後に後続の呼び出しが許可される前になります。

- SSL を使用している場合、プレーン テキスト以外のことを本当に心配する必要がありますか?

前述のように、.NET 3.5 はフォーム アプリ、IIS がホストする WCF サービスを獲得しますが、重要なことは、すべての WCF サービスがこの承認手順を必要とすることです (ただし、セッション、http ヘッダーなどである必要があります)。誰でもこれらのサービスに Web からアクセスできるようにしたいと考えています。

上記の投稿が大きいことは承知していますが、すでに行ったルートと達成する必要があることを表現する必要がありました。

PS: この投稿についても認識しています ユーザー名/パスワード + SSL を使用して WCF で安全な RESTful サービスを構成する方法コミュニティが WCF サービスの REST から離れることを提案している場合は、これを行うことができますが、一貫性を保つためにこれから始めましたパブリック API が来るように。

WCF サービスにアクセスする方法を述べることが重要だと思います (サービスへの接続は機能していますが、資格情報を検証してから Member オブジェクトを返す最善の方法は何ですか?)。

WebChannelFactory<IMemberService> cf = new WebChannelFactory<IMemberService>(
                new Uri(Properties.Settings.Default.MemberServiceEndpoint));
            IMemberService channel = cf.CreateChannel();
            Member m = channel.GetMember("user", "pass");

MSの記事から半分実装されたコード(およびテスト用に私自身のもの):

 public Member GetMember(string username, string password)
    {
        if (string.IsNullOrEmpty(username))
            throw new WebProtocolException(HttpStatusCode.BadRequest, "Username must be provided.", null);
        if (string.IsNullOrEmpty(password))
            throw new WebProtocolException(HttpStatusCode.BadRequest, "Password must be provided.", null);

        if (!AuthenticateMember(username))
        {
            WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
            return null;
        }

        return new Member() { Username = "goneale" };
    }
4

4 に答える 4

17

私は WCF の REST 機能に関する経験はありませんが、WCF のセキュリティに関する質問でセキュリティの選択が意味することを理解するのにかなり苦労しました。お気づきのように、Web 上には WCF に関するドキュメントが本当に不足しており、REST の経験は限られています。

どのセキュリティ実装を使用すればよいですか?

SSL を使用している場合、プレーン テキスト以外のことを本当に心配する必要がありますか?

SSL を介した基本認証は問題ありません。結局のところ、既存の Web サイトの多くは、この方法でユーザーを認証しています。(Amazon のショッピング アカウントにログインすると、入力したユーザー名とパスワードが SSL 接続を介して送信されるだけです。) セキュリティと辞書攻撃についてこの記事が何を言っているのかは理解できますが、何とか何とか、シンプルにしておいてください。そして、最初に何かを機能させます。UPS の Plain Old XML API は呼び出しごとにユーザー名とパスワードを要求します。FedEx の POX API もそうですし、PayPal の SOAP API と Cyber​​Source の SOAP API もそうです。これは実際の使用には十分なようです。

すべての WCF 呼び出しでユーザー名/パスワードを送信しないようにする方法はありますか? 接続が最初に確立されている場合は、これらの余分なバイトを送信しないことをお勧めします。これは、ログイン後に後続の呼び出しが許可される前になります。

これは、もう少し自信を持って答えることができるものです。通常、パブリック向けの WCF サービスをステートレスになるように設計しようとします。そうすれば、WCF サービスは簡単に拡張できます。より多くのハードウェア、より多くのサーバー、およびロード バランサーを問題に投入するだけで、スティッキー セッションやどこかでセッション状態を維持することについて心配する必要はありません。つまり、「ユーザーのログインを維持したい」場合、それはサーバー上で起こることではありません。

私がやったことは、自分の Web サイトを信頼できるサブシステムとして扱うことでした。事前共有 X509 証明書を使用して WCF サービスに対して認証を行い、顧客がフォーム認証を介して Web サイトにログインした場合は、顧客のユーザー名ヘッダーをサービスに送信します。WCF サービスのカスタム エンドポイント動作は、このヘッダーを探し、信頼できるサブシステムによってインストールされたことを確認し、ユーザーのパスワードを提供したり、データベースに対して検証したりする必要なく、そのユーザーの偽装に進みます。

REST を使用しているため、おそらくクライアント側で Cookie を使用して状態を維持できます。ASP.NET 互換モードを使用する場合は、フォーム認証を直接使用することもできると思いますが、私の WCF サービスは IIS でホストされていないため、このアプローチについてはよくわかりません。

要するに、ユーザー名とパスワード、ユーザー名だけ、または Cookie に保存されたハッシュ値など、ユーザーを識別するために、要求ごとに何かを送信する必要があります。最後のオプションの場合、Login()サービスに何らかのメソッドまたは何かが必要になると思います。「わかりました。将来のリクエストでこのハッシュ値を渡すと、ログに記録されます。」しかし、すべての REST クライアントが Cookie の受信を期待しているわけではなく、状態のない単純な GET/PUT/POST/DELETE 要求だけです。

それらが私の靴だった場合、信頼できるサブシステムのアプローチ (サブシステムの事前共有資格情報と共にユーザー名ヘッダーが提供される) を使用するか、すべての呼び出しで認証を要求します。これらの繰り返しのリクエストがすべて問題になった場合、サービスはおそらく何らかの高性能認証キャッシュメカニズムを取得するでしょう.

それが少し役立つことを願っています。

于 2008-12-28T22:57:29.770 に答える
7

基本認証の使用:

WebHttpBinding binding = new WebHttpBinding();
binding.SendTimeout = TimeSpan.FromSeconds(25);
binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

Uri address = new Uri("http://localhost:3525/WcfRestWeb/Quotes.svc");

WebChannelFactory<IQuoteService> factory =
             new WebChannelFactory<IQuoteService>(binding, address);

factory.Credentials.UserName.UserName = "tan";
factory.Credentials.UserName.Password = "wani";

IQuoteService proxy = factory.CreateChannel();

var response = proxy.GenerateQuote(GetQuoteRequest());
Console.WriteLine("Quote Amount: " + response.QuoteAmount);
于 2010-03-31T18:16:44.310 に答える
3

答えてくれてありがとう。一歩下がって、問題全体を明確かつ偏りなく見てください (つまり、RESTful サービスを調べるのに費やした 4 時間以上を無視します)。瞬間はこれらです: -

これは私が望むものに当てはまるようです。

lextm:この記事を書いた後、WCF のセキュリティ ガイドを詳しく調べて、各原則について検討してほしいオプションに基づいて、すべての要件をメモしました。

選択しました:
- 転送セキュリティ モード: トランスポート セキュリティ
- 認証。オプション: 基本セキュリティ
- バインディング: wsHttpBinding
- ユーザー名バリデータによるカスタム認証

それぞれに提供されている例に照らして、WCF サービスを使用した Windows フォームの使用例を見ると、最善の方法のように思えます。

Nicholas:サービスがステートレスになるように設計することは、おそらくより良いアプローチです。

したがって、時間があるときにフォローする記事に基づいて、X509証明書を利用しています。私はこれに非常に慣れていません (このニコラスを使用していることを理解しています) このクライアント アプリをインターネットからダウンロードして、私の Web サイトのアカウントを持っている PC にインストールできることを考えると、これで問題ありませんか?

あなたのすべての助けに乾杯、グラハム

PS:これは私のシナリオに最も近いユース ケースだと思います(トランスポート セキュリティを使用したい場合を除く)。証明書を気にしないので、これを実装することを検討すべきですか? 私が読んだ引用から、証明書が必要になるかもしれません。「クライアントの資格情報 (ユーザー名/パスワード) が SOAP メッセージでクリア テキストとして渡されるため、WCF では X509 証明書の暗号化が必要です。」-しかし、私が学んだことと私たちが言ったことから、SSLを使用している場合、この点はおそらく意味がありませんか?

于 2008-12-29T05:24:22.813 に答える
1

まあ、WCF 側が重要なので、WinForms 側にはあまり注意を払うべきではありません。

ところで、あなたはこれらのページを注意深く読みましたか?

コンセプト http://www.codeplex.com/WCFSecurityGuide/Wiki/View.aspx?title=Ch%2005%20-%20Authentication,%20Authorization%20and%20Identities%20in%20WCF&referringTitle=Home

および http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20Tos&referringTitle=Homeの方法

于 2008-12-28T11:35:11.287 に答える