2011-03-02 9 views
6

:私はこれらの資格情報がWCFコールのサービス側でユーザー名とパスワードを取得する方法は?私は次のコードでクライアントに資格情報を提供する場合

operationContext.IncomingMessageHeaders[1] 

で利用可能であることがわかり、サーバー側で次に

myChannelFactory.Credentials.UserName.UserName = "username"; 
myChannelFactory.Credentials.UserName.Password = "password"; 

しかしユーザ名を取得するには、それ以上convenenient方法があるとパスワード?私がOperationContextで見るのは、プロパティとタイプのないリストの混乱であり、私はこれを得ることができる場所を示すものは何も見つかりません。

+0

なぜこれが欲しいですか?追加の認証を実行しようとしていますか? – McKay

答えて

3

ServiceSecurityContext classの静的Current propertyを使用して、呼び出されている操作の現在のServiceSecurityContextを取得できます。

あなたは、その後に渡された資格情報を持つユーザーのIDを取得するためにPrimaryIdentity propertyを使用することができます。

をしかし、それはしません(またそれはず)、パスワードを公開します。本当にパスワードが必要な場合は、見たようにメッセージレベルにドロップしてヘッダーを調べる必要があります。

+0

これは別のものです。 SecurityCServiceContextには、WINDOWS CREDENTIALSというユーザが含まれています。それは私がチャンネル工場で設定した資格とはまったく異なるものです。 –

+0

@Kalaz:いいえ、そうではありません.WindowsIdentityプロパティはWINDOWSのクレデンシャルを与えます。 PrimaryIdentityは完全に別のものです。 – casperOne

2

これは、使用しているバインディングに完全に依存しており、一般的な答えはありません。例えば

、あなたはNetNamedPipeBindingを使用して行う場合

myChannelFactory.Credentials.UserName.UserName = "username"; 
myChannelFactory.Credentials.UserName.Password = "password"; 

あなたはあなたの時間を無駄にしている。このデータで何もしませんバインディングクライアント側は、それがメッセージになりません、そして、それは勝ちましたサービス側では全くアクセスできません。

バインディングは、ユーザー名/パスワードの資格情報の使用を指定するセキュリティオプションで構成されている場合にのみ、このデータを消費します。そのようにするすべての標準バインディングは、認証のために資格情報を使用します。その結果は、casperOneが示すようにServiceSecurityContextを介してサービスに表示され、パスワードデータは含まれません。

認証をサポートするには、データをメッセージヘッダーのどこかに格納する必要があります。正確にどこでどのような形で再び束縛依存であろうか。あなたはいつもそれらをoperationContext.IncomingMessageHeaders[1]に見つけると仮定しないでください。

編集: あなたが探しているものを提供するカスタムバインディングを構築することができます。

サービス側で
CustomBinding binding = new CustomBinding(...); 
binding.Elements.Insert(1, 
    SecurityBindingElement.CreateUserNameOverTransportBindingElement()); 

UserNamePasswordValidatorを提供し、このような資格情報を設定します。

serviceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = 
    System.ServiceModel.Security.UserNamePasswordValidationMode.Custom; 
servicehost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = 
    new MyUserNamePasswordValidator(); 

ユーザー名とパスワードは、MyUserNamePasswordValidatorValidate方法に配信されます。

警告:セキュリティ保護されたトランスポートを使用している場合を除き、資格情報はメッセージヘッダーでクリアに送信されるため、これは安全な認証メカニズムではありません。

+0

Hmはい真です。まあ、カスタムバインディングを設定して、サーバー側の両方の情報をコードの1つの場所に持たせることができますか? (ユーザー名/パスワードとドメイン資格情報に関する情報)有効なものを使用できるように、両方の部分が1か所に必要です。 –

+0

@Kalaz:私の答えに編集を参照してください。カスタムのユーザー名/パスワードの検証を行うことができます。しかし、ドメイン資格情報を参照する際に、これがまさにあなたが探しているものであるかどうかは分かりません。 –

+0

私は週末までにあなたの提案を試してみます。ドメイン資格情報に関する混乱を解消するには:私が探しているのは、ドメイン+自分のカスタムログイン/パスワードのメンバーシップを介してユーザーを認証する方法です。実際には、アプリケーションがシングルサインオンで動作するように、ドメインメンバシップを使用します。ただし、ドメイン情報が利用できない場合は、カスタム認証情報を使用します。あなたのソリューションがドメイン情報でアクセス可能なSecurityContextを生成するなら、私が探しているものになります。 –

関連する問題