認証済み SSPI サーバーの書き込み
クライアント・プログラムとサーバー・プログラムの間で認証済み通信を行う前に、サーバーはその認証情報を登録する必要があります。 特に、サーバーはプリンシパル名を登録し、使用する認証サービスを指定する必要があります。 プリンシパル名の詳細については、「プリンシパル 名」を参照してください。 認証サービスの詳細については、「 Authentication Services」を参照してください。
その認証情報を登録するために、サーバーは RpcServerRegisterAuthInfo 関数を呼び出します。 プリンシパル名へのポインターを最初のパラメーターの値として渡します。 2 番目のパラメーターを、アプリケーションが使用する認証サービスを示す定数に設定します。 認証サービスの説明については、「 Authentication-Service Constants」を参照してください。
サーバーは、キー取得関数のアドレスを 3 番目のパラメーターの値として渡すこともできます。 「キー取得関数」を参照してください。 選択した認証サービスに対して既定のキー取得関数を使用するには、3 番目のパラメーターを NULL に設定 します。 RpcServerRegisterAuthInfo 関数の最後のパラメーターは、キー取得関数を指定した場合にキー取得関数に渡すポインター データです。 RpcServerRegisterAuthInfo の呼び出しを次のコード フラグメントに示します。
dwStatus = DsMakeSpn(
"ldap",
"ServerName.domain.com",
NULL,
0,
NULL,
&pcSpnLength,
pszSpn);
rpcStatus = RpcServerRegisterAuthInfo (
psz, // Server principal name
RPC_C_AUTHN_GSS_NEGOTIATE, // Authentication service
NULL, // Use default key function
NULL); // No arg for key function
さらに、サーバーは RPC ランタイム ライブラリに承認関数を提供する場合があります。 承認関数を設定するには、 RpcMgmtSetAuthorizationFn 関数を呼び出します。
分散アプリケーションのサーバー部分は、 関数 RpcBindingInqAuthClient または RpcBindingInqAuthClientEx を呼び出して、バインディング ハンドルに対して認証情報のクエリを実行できます。
サーバーがセキュリティ サポート プロバイダーに登録されている場合、無効な資格情報を使用したクライアント呼び出しはディスパッチされません。 ただし、資格情報のない呼び出しはディスパッチされます。 この問題が発生しないようにするには、次の 3 つの方法があります。
- RpcServerRegisterIfEx を使用して、セキュリティ コールバック関数を使用してインターフェイスを登録します。これにより、RPC ランタイム ライブラリは、そのインターフェイスに対する認証されていない呼び出しを自動的に拒否します。 コールバック関数の登録は、アクセス資格情報を確認する他のメソッドと互換性があります。コールバック関数は、それ自体で RpcImpersonateClient、 RpcGetAuthorizationContextForClient、または RpcBindingInqAuthClientEx 関数などを呼び出すことができます。 ただし、これらの関数では、関数に渡された引数を使用できません。これは、その時点では変更されないためです。
重要
RpcServerRegisterIfEx を使用してセキュリティ コールバック関数を使用してインターフェイスを登録することは、クライアント資格情報を確認する最も推奨される方法です。
- RpcBindingInqAuthClient を呼び出して、クライアントが使用しているセキュリティ レベルを確認します。 その後、クライアントが認証されていない場合、スタブからエラーが返される可能性があります。