2012-04-25 12 views
2

WCFセキュリティにカスタムのユーザー名とパスワードの検証を使用しています。今私は要求の間にユーザー名を保存して、後で呼び出されるメソッドにアクセスできるようにしたいと思います。それ、どうやったら出来るの?WCFリクエストにデータを格納する場所

私の問題を記述するためのいくつかのサンプルコード:今すぐ

public class CustomUserValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string username, string password) 
    { 
     if (username == "aaa" && password == "bbb") 
     { 
      // store username where i can get it in method called later. 
      return; 
     } 
     throw new SecurityTokenException("Unknown Username or Password"); 
    } 
} 

呼び出されるメソッド:

public void WebServiceMethod() 
{ 
    Database.User.Single(c => c.Username == /* username from above */); 
} 

BR
アンドレアス

+0

最も簡単な方法は静的なユーザー名プロパティに格納することです。より良い方法は、カスタムWCF動作を記述することです。 – daryal

+3

@daryalはすべてのレベルで悪いです。 a:WCFはマルチスレッドであり、b:WCFは異なる点で異なるスレッドを使用できます(スレッド静的には信頼できません) –

+0

@MarcGravellあなたはすべてのレベルで正しくあります:)しかし、この質問に答えるには、インスタンスモードとコンカレントモードが提供される。それで私は行動を書くことを提案したのです。 – daryal

答えて

3

あなたが発行してこれを行う一般的でしょうカスタム "プリンシパル"は、IAuthorizationPolicyで行われます。 IIRCの場合、ユーザ名は評価コンテキストパラメータを介してauth-policyで使用できるようになります。 A 一般 WCFのカスタムプリンシパルへのウォークスルーはhereですが、Evaluateのビットを試して、評価コンテキストで受信ユーザー名を見つける必要があります。特に、いずれかのキーが「claim」辞書である場合は、それを見てください。そして、評価コンテキストで.Claimsを見てください。のユーザー名でCustomUserValidatorによって発行された「請求」を見つける必要があります。

私は以前の仕事で説明した内容を正確に行っています。そして、上記のページを出発点としてIIRCがうまくいきました。あなたが校長を発行した後

、それは経由して、通常のように、利用できるようになります:単一WCF要求を通じて、あらゆる種類のデータを格納するために

string cn = Thread.CurrentPrincipal.Identity.Name; 
関連する問題