私は次のものが必要なプロジェクトに取り組んでいます。
- サーバー側のWCFサービス(.NET 3.5)
- クライアント側のWPFクライアント(.NET 3.0)
(サーバー側で)認証と承認を使用する必要がある既存のアプリケーションがあります。また、ユーザーに関するメタデータをWCFサービスのスレッドプリンシパル(サイトオブジェクト)に保存する必要があります。これは、どうしても必要な場合にWCFサービスで取得できるようにするためです。一部のビジネスロジックでは、これが必要になる場合があります。だから私の計画は次のことをすることでした...
サーバー用のカスタムServiceAuthorizationManagerを作成し、そこでユーザーにログインして、既存のアプリケーションからロールを取得します。「Site」オブジェクトをキャッシュし、さらにリクエストがあればキャッシュからプルします。カスタムデータを保持するためのCustomPrincipalオブジェクトも必要です。次のようにWCFで組み込みの役割フィルタリングを使用できるように、ユーザーを偽装したいと思います。
[PrincipalPermission(SecurityAction.Demand, Role = "Role1")]
public string[] RolesForUser(string username){}
カスタムロールプロバイダーでASP.NET承認を使用しようとしましたが、現在のプリンシパルに何も設定できませんでした。また、カスタムIAuthorizationPolicyを使用しようとしましたが、問題が発生しました。これらの問題は、WCFClient.exeアプリケーションを使用できることを扱っていましたが、(mex endpoingを使用して)検出したときに資格情報が提供されないため、ログインが失敗しました。最終的に、ServiceAuthorizationManagerが正しい方法であると判断しましたが、他の提案も受け付けています。
クライアントで、次のように資格情報を収集し、それらをWCFプロキシクラスに配置します。
proxy.ChannelFactory.Credentials.UserName.UserName = userName;
proxy.ChannelFactory.Credentials.UserName.Password = password;
このルートをたどり始めると、マネージャークラスのCheckAccessCoreメソッドでユーザー名/パスワードを取得できないことに気付きました。さらに調査したところ、カスタムUserNamePasswordValidatorで実際に認証する必要があることがわかりました。そこで、そのうちの1つを作成しました。問題は、validateメソッドが呼び出されないことです。
さらに調査したところ、validateメソッドを呼び出すには、WCFサービスにメッセージレベルまたはトランスポートレベルのセキュリティが必要であることがわかりました。それに関する問題は、 X.509証明書なしでメッセージまたはトランスポートレベルのセキュリティを設定する方法を理解できないことです。この製品は数百台の非常にロックダウンされたマシンに組み込まれ、証明書をインストールすることはできません。
証明書をインストールせずに、私が求めていることを実行する方法はありますか?