次のシナリオがあります。
IIS 7 でホストされる WCF .NET 4 サービスがあります。
このサービスには、次の 2 種類のクライアントがアクセスします。
- Silverlight クライアント (後で作成します)
- 3 つの C# .NET 4 コンソール アプリケーション (作成およびテスト済み)
この WCF サービスにアクセスするために、単純なラッパー dll を作成しました (WCF が変更されたときに複数のプロジェクトで更新されるのを避けるために、Visual Studio の自動生成された参照は使用しませんが、ラッパーのテンプレートとして自動生成された参照を使用しました)。
これは私のラッパーがどのように見えるかです:
class MyServiceClient : System.ServiceModel.ClientBase<IMyService>,
IMyService
基本的に、すべての呼び出しを base.Channel に転送します。
ここで、認証の実装について考え始めました。IIS とコンソール アプリが同じドメインにあることが保証されていないため、Windows 認証はオプションではありません。明らかに、コンソール アプリのアプリ構成ファイルにユーザー名とパスワードを保存する必要があり、WCF はそれをユーザー データベースと照合します。
メッセージごとの認証は、トラフィックが多すぎてリソースが多すぎるようです。その場合、呼び出しごとに DB からユーザーを選択する必要があります。私たちのコンソール アプリはスケジュールされたタスクであり、1 日中実行され、何千もの WCF 要求を発行する可能性があります。そのため、ある種の認証済みユーザー セッションが必要です。
また、System.ServiceModel.ClientBase が予期せず切断された場合にどうなるか心配です。現在 (認証なしで)、ClientBase は問題なくサイレントに再接続できます。認証実装を追加した後も同じ動作を維持したいと思います。クライアントは、呼び出し元のアプリケーションに例外をスローすることなく、サイレント モードで再ログインできる必要があります。
私が理解している限り、WCF ですべての ASP.NET セッション機能を使用できるようにするには、ASP.Net 互換モードで実行し、各ユーザーが独自の Thread.CurrentPrincipal を持つ独自のスレッドを持つようにする必要があります。しかし、接続が中断されたりサーバーが再起動されたりした場合に、ログインが自動的に再起動されるようにする方法がわかりません。各メソッド呼び出しに tr..catch を追加し、SecurityException がある場合は再ログインする必要がありますか? 少し汚い解決策のようです。
これで、次の 2 つの質問を要約できます。
IIS WCF サービスとコンソール アプリ間の認証済みの自動復元可能なセッションには、どのようなオプションがありますか?
ある方法で認証セッションを実装する方法は?
Silverlight が wshttpbinding をサポートしておらず、WCF が (セキュリティ上の理由により) basichttpbinding を介してユーザー資格情報を渡すことを許可していない場合、安全な方法で認証を実装するにはどうすればよいでしょうか? 次の記事を見つけました: http://www.dotnetcurry.com/ShowArticle.aspx?ID=589 では、Silverlight でカスタム バインディングを介して SSL を使用する方法を説明していますが、認証セッションを設定する方法がわかりません。そのため、コンソール アプリでも使用できます。