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" };
}