0

わかりました、ここで ASP.NET セキュリティ モデルに関する私の愚かさを実際に示しますが、ここでは行きます。

私は WCF Web サービスを持っており、カスタム メンバーシップ プロバイダーを介してパイプする方法をハックすることができました。

私のメンバーシップ プロバイダーは、SQL サーバー インスタンスからのデータを使用してユーザー オブジェクトを読み込もうとする "ValidateUser" をオーバーライドします。クレドを取得し、users オブジェクトをロードして、問題がなければ true を返します。

この時点で、私は通常、ユーザー オブジェクト (または ID) をセッションに詰め込むか、実際にはリクエストの存続期間中にアクセスできる状態バッグに詰め込みます。私が直面している問題は、ASP 互換性属性を使用しているにもかかわらず、この時点で HttpContext が null であることです。

他にどのようなオプションがありますか? 乾杯、クリス。

編集:

やりたいことを明確にするだけです。サーバーで認証されるユーザー資格情報を渡したいのですが、これが発生したら、認証されたユーザーの詳細を、サービス要求の存続期間中のみアクセスできる場所に保持したいと考えています。これは Http.Current.Items と同等でしょうか?

静的プロパティを介してグローバルにアクセスできる (つまり、HttpContext.Current と同様の方法で) 要求ごとにインスタンス化されるオブジェクトはありますか? OperationContext は this だと思っていたのですが、これも null ですか?

これは本当に珍しい問題でしょうか?クレデンシャルを送信 > ユーザーを取得 > リクエストの処理中にアクセスできるようにユーザーをどこかに詰め込みます。私にはかなり一般的なようですが、何が欠けていますか?

乾杯、クリス。

4

1 に答える 1

0

基本的に、WCF で推奨されるベスト プラクティス ソリューションは、呼び出しごとのアクティブ化を使用することです。たとえば、新しい要求/呼び出しごとにサービス クラスの新しいインスタンスが取得され、認証や承認などの必要なすべての手順が要求ごとに実行されます。

これは非効率に聞こえるかもしれませんが、Web アプリ、特に Web サービスは、可能な限り完全にステートレスであるべきです。「ステート バッグ」に何かを入れると、後で問題が発生するだけです。キャッシュされた資格情報のコピーをいつ無効にするかをどのように判断すればよいでしょうか。ユーザーがアプリを使用しているが、Cookie がユーザーのマシンに残っている場合はどうなるでしょうか?

全体として、これらのステップを毎回実行するという考えに慣れるようにすることを強くお勧めします. はい、処理時間が少しかかりますが、一方で、本質的にステートレスな環境での状態管理に関しては、多くの悲しみから身を守ることができます。 ..

あなたがまだそのkludgeを主張するなら、あなたはHttpContextへのアクセスを与えるはずのWCFのASP.NET "compabitility"モードを有効にすることができます - しかし、繰り返しますが、私は強くお勧めしません。最初の最も明白な制限は、もちろん、この ASP.NET 互換モードは IIS で WCF サービスをホストしている場合にのみ機能するということです。

ASP.NET 互換モードを有効にするには、web.config で次の設定を使用します。

<system.serviceModel>
   <serviceHostingEnvironment 
        aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

また、サービスの実装 (サービス コントラクトを実装するクラス) を対応する属性で装飾する必要があります。

[AspNetCompatibilityRequirements(RequirementsMode=
       AspNetCompatibilityRequirementsMode.Allowed)]
class YourService : IYourService

AspNetCompatibilityRequirementsMode、またはNotAllowedです。AllowedRequired

詳細と詳しい説明については、ASP.NET 互換モードに関する Wenlong Dong のブログ投稿を参照してください。

于 2009-11-28T22:32:43.293 に答える