長いタイトルでごめんなさい。
これは、WCF の構成とセキュリティに関するものです。次のシナリオがあります。
- 1 つのサーバー (IIS)
- N クライアント (WPF アプリケーション)
- クライアントとサーバー間で通信するための Web サービス
- すべてが同じLANと同じドメインにあります
- サーバーがすべてのクライアントに通知できるように、二重通信が必要です (ポーリングはありませんが、WCF コールバックを使用します)。
- ユーザーの資格情報 (ログイン/パスワード) は Active Directory によって管理されます
- ユーザー認証は「ユーザーごと」であり、「Windows アカウントごと」でも「マシンごと」でもありません
理想的には、2 つの異なるサービスが必要です。
コールバックを使用できるように WCF セッションを必要とするもの:
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))]
public interface IService1
{
[OperationContract(IsOneWay = false, IsInitiating = true)]
void Subscribe();
[OperationContract(IsOneWay = false, IsTerminating = true)]
void Unsubscribe();
}
そうではないので、古き良き方法を使用して、ステートレスで効率的で保守可能なサービスを記述できます。各 WCF 呼び出しは認証および承認され、サーバー側で Service 実装の新しい新しいインスタンスを生成します。
[ServiceContract]
public interface IService2
{
[OperationContract]
int DoSomeStuff();
}
問題は、すべてのクライアントが Active Directory に対して認証されることです。そのため、クライアント アプリケーションの起動時に、すべてのクライアントがログイン、パスワード、およびドメインを指定する必要があります。問題は、AD 認証に非常に時間がかかることです。
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "theDomain"))
{
if (!pc.ValidateCredentials("theUser", "thePassword"))
{
throw new SecurityException();
}
}
私の最初のアイデアは、IService1
(コールバックの送信を担当する) サービスを認証サービスとして使用することでした。
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))]
public interface IService1
{
[OperationContract(IsOneWay = false, IsInitiating = true)]
void Login(string login, string password, string domain);
[OperationContract(IsOneWay = false, IsTerminating = true)]
void Logout();
}
したがって、Login
操作の実装内で、ユーザーのログイン/パスワードを AD に対して 1 回だけチェックし、クライアントからの次の WCF 要求については WCF セッションに依存することができます。IService1
問題は、セッションモードが であるため、サービスRequired
に対して他のリクエストを行いたくないInstanceContextMode
ことですPerSession
(はい、ログイン/ログアウト/クライアント通知以外の操作では避けたい醜いクライアントプロキシシングルトンパターン) .
問題は、どうすれば自分のサービスを構築して構成できるかということです。
- WCF リクエストごとに AD に対してリクエストする必要はありません
- サーバーコールバックがあります
IService2
コールバック サービス (「実際の」サービスではない) には、セッションごとにシングルトン パターン/セッションが必要/インスタンス コンテキストしかありません。
wsHttpBinding
forIService2
とnetTcpBinding
forを考えていましたIService1
。転送セキュリティ (トランスポートまたはメッセージ) の選択と資格情報の種類 (Windows、UserName、.. ?) の選択については、よくわかりません。
どんな助けでも大歓迎です。