質問

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

私が尋ねる理由は、別の方法を表現するさまざまな記事や投稿を調べた結果、最終的に WCF セキュリティのベスト プラクティスに関する約 650 ページの文書にたどり着き、非常に混乱しているからです。」http://www.codeplex.com/WCFSecurityGuide)私のシナリオを考えると、どのアプローチを取るのが最善であるか、実装をどのように開始すればよいかわかりません。

この記事「WCF 3.5 を使用した RESTful Web サービスの設計と構築のガイド」() から始めました。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 の Win Forms アプリ、IIS でホストされる WCF サービスでは、重要なことは、すべての WCF サービスでこの認証手順 (ただし、セッション、http ヘッダーなど) が必要であることを望んでいることです。誰でも Web からこれらのサービスにアクセスできるようにしたいと考えています。

上記の投稿が膨大であることは承知していますが、私がこれまでたどってきた道と、何を達成する必要があるかを表現する必要がありました。あらゆるご支援をいただければ幸いです。

追伸:私もこの投稿を知っています ユーザー名/パスワード + 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" };
    }
役に立ちましたか?

解決

まあ、私は WCF の REST 機能を使用した経験はありませんが、WCF のセキュリティ選択の影響を理解するのにかなり苦労しました。 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を受け取ることを期待しているわけではありません。

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

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

他のヒント

基本認証の使用:

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);

ご回答ありがとうございます。一歩下がって、全体として問題を明確かつ公平に見てください(つまり、RESTfulサービスの検討に費やした4時間以上を無視して)、今のところRESTなしで物事を動作させることを試みており、参考文献に従おうとしていますその瞬間は次のとおりです。-

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

レクストム: この件に関しては、私がこの投稿を書いた後、WCF セキュリティ ガイドを詳しく調べて、各原則について考慮してほしいオプションに基づいて、すべての要件をメモしました。

私は選んだ:
- 転送セキュリティモード:輸送セキュリティ
- 認証。オプション:基本的なセキュリティ
- バインディング:wsHttpBinding
- ユーザー名バリデータによるカスタム認証

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

ニコラス: 確かに、サービスをステートレスになるように設計する方が、おそらくより良いアプローチであることに同意します。

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

グラハム、あなたのすべての助けをありがとう

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

まあ、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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top