10


10

.NET 3.5 / VS 2008上のASP.NET Webサービス用のカスタムHTTP基本認証

ASP.NET Webサービスを使用してWebサービスインターフェイスを公開するために、動作しているASP.NET Webアプリケーションをリファクタリングしています。 https://stackoverflow.com/questions/162376/web-services-authentication-best-practices [Webサービス認証 - ベストプラクティス]によると、httpsを介した基本認証が有効な方法です。 WS-SecurityやX509などを行うのではなく、それが正しいと仮定しましょう。

NET 3.5 / VS 2008では、カスタムのhttp基本認証(Windows以外のアカウント)を実装する最も簡単な方法は何ですか。たとえば、ユーザー名が "foo"でパスワードが "bar"の場合にのみ受け入れます。 最終的に、 `Thread.CurrentPrincipal`セットをお願いします。

自分のHttpModuleを書くのですか、それとももっと簡単にできますか?

3 Answer


5


http://www.leastprivilege.com/default.aspx[Dominick Baier]によって書かれた http://www.leastprivilege.com/default.aspx[IIS用のカスタム基本認証]を使用することがあります。  http://www.leastprivilege.com/WCFUsernamesOverTransportAndIISHosting.aspx[彼の指摘するとおり]私の質問はWCFではなくASP.NET Webサービスに関するものでしたが、トランスポートセキュリティに対するWCF 3.5のユーザー名はIISホストサービスでは使用できません。
http://www.codeproject.com/KB/aspnet/mybasicauthentication.aspx[カスタムデータソースに対するASP.NETの基本認証]と呼ばれるHTTPモジュールの別の実装があります。http://www.codeproject.com/script/Articles/ MemberArticles.aspx?amid = 910952 [Santosh Sahoo]。

それは私が望んでいたものではありませんが、私は QuickStartチュートリアルのSOAPヘッダーサンプルが有益な回避策であることを見つけました。 プレーンテキストでhttpを介してパスワードを送信することは明らかに安全ではありませんが、この例はセキュリティを強化するために拡張することができます。例えばhttpsで実行したり「password one-time GUID timestamp」のハッシュを送信します。


3


`Authorization`ヘッダの値を取得し、それを解析してユーザ名とパスワードを検証します。

値は、Base64文字列としてエンコードされたusername:passwordです。

詳しくはhttp://en.wikipedia.org/wiki/Basic_access_authenticationをご覧ください。

編集:あなたがすべてのリクエストに対してカスタム認証スキームを使いたいのなら、ヘッダの解析とスレッドのプリンシパルの設定を扱うための `HttpModule`を書くほうが簡単です。


1


WCFを検討している場合は、basicHttpBindingにusernameOverTransportセキュリティを使用できます。 すなわち ユーザー名とパスワードはリクエストのSOAPヘッダーにあり、すべてのトラフィックはSSL暗号化によって保護されています。

カスタムのUserNamePasswordValidatorバリデータを使用して、着信クレデンシャルを認証できます。 データベース。

サービス動作のカスタムIAuthorizationPolicy内にスレッドプリンシパルを設定できます。

例えば 現在のプリンシパルを設定するためのIAuthorizationPolicyのメソッド実装を評価します

public bool Evaluate(EvaluationContext evaluationContext、refオブジェクトの状態){Object obj; if(evaluationContext.Properties.TryGetValue( "Identities"、out obj)){//認証済みIDを取得するIIdentityクライアント=(obist as IList)[0]; evaluationContext.Properties ["Principal"] = ... //アイデンティティ用のプリンシパルobjをここに作成する//これによりスレッドの現在のプリンシパルが設定されます} return true; }