0

さて、私のサービスの最初のバージョンでは、二重契約を結んでいるので、正しくログに記録されている場合は、ユーザー名などの情報をクライアントに保存できます...など。目標は、メソッドの呼び出しを許可することだけでした。クライアントは正しくログに記録されました。

ただし、大きなファイルを処理する必要があるため、サービスでストリーミング転送モードを使用する必要があると判断しましたが、トランスポートモードとしてストリーミングを使用する場合、デュプレックスコントラクトを使用できません。

だから私の質問は、クライアントがログに記録されているかどうかをどうやって知ることができるかということです。すべての呼び出しでユーザーとパスワードを送信したくありません。

また、スケーラビリティの理由から、呼び出しごとにサービスを使用したいので、呼び出しから他の呼び出しへの情報を保存できません。または、ログに記録されたすべてのクライアントで静的リストを使用できますか?

ありがとう。

4

2 に答える 2

1

「簡単な」方法:

  1. ユーザー名とパスワードに基づいてユーザーを認証するメソッドをサービス上に作成します。認証が正常に行われた場合は、トークン(GUID)を生成します。トークンを保存するには、CouchBaseなどの高性能の外部キャッシュシステムを使用します。

  2. クライアントリクエストごとに、トークンをメッセージヘッダーに渡して、サービスレベルで、メッセージインスペクターを使用してトークンを取得できるようにします。取得したら、同じトークンが外部キャッシュに存在するかどうかを確認します。もしそうなら、あなたはリクエストがその旅行を続けることを許可することができます、そうでなければ、例外(障害)を投げて、使用された場所で間違ったクレデンシャルをクライアントに知らせます。

  3. トークンをキャッシュセットアップと有効期限ポリシーに保存すると、リクエストが成功するたびに更新されます。

セッションなしで呼び出しごとに使用するため、クライアントがサービスの使用をいつ停止するかを正確に知ることはできません(Windowsアプリケーション/ブラウザーが閉じているなど)。したがって、トークンはしばらくの間キャッシュに存在します(キャッシュポリシーによって定義されます)。

「複雑な」方法:

  1. セキュリティトークンサービス(STS)を利用する http://msdn.microsoft.com/en-us/library/ee804740.aspx
于 2012-06-26T19:09:53.057 に答える
1

各リクエストでユーザー名とパスワードを渡してもTCPバインディングがあれば、保護レベルがEncryptAndSignに設定されていればかなり安全です。Windows認証モードが設定されている場合、チャネルはこの情報を各要求に自動的に埋め込みます。

<security mode = "Transport">
            <transport
               clientCredentialType = "Windows"
               protectionLevel = "EncryptAndSign"
            />
</security>
于 2012-06-27T05:24:43.560 に答える