Запись сервера SSPI с проверкой подлинности
Перед прохождением проверки подлинности между клиентом и серверной программами сервер должен зарегистрировать сведения о проверке подлинности. В частности, сервер должен зарегистрировать имя участника и указать службу проверки подлинности, используемой им. Дополнительные сведения об именах субъектов см. в разделе Имена субъектов. Дополнительные сведения о службах проверки подлинности см. в разделе Службы проверки подлинности.
Чтобы зарегистрировать сведения о проверке подлинности, серверы вызывают функцию RpcServerRegisterAuthInfo . Передайте указатель на имя субъекта в качестве значения первого параметра. Присвойте второму параметру константу, указывающую службу проверки подлинности, которую будет использовать приложение. Описание служб проверки подлинности см. в разделе Authentication-Service Constants.
Сервер также может передать адрес функции получения ключа в качестве значения третьего параметра. См. раздел Ключевые функции приобретения. Чтобы использовать функцию получения ключа по умолчанию для выбранной службы проверки подлинности, присвойте третьему параметру значение 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 для запроса дескриптора привязки для получения сведений о проверке подлинности.
Если сервер регистрируется у поставщика поддержки безопасности, клиентские вызовы с недопустимыми учетными данными не будут отправляться. Однако вызовы без учетных данных будут отправляться. Это можно предотвратить тремя способами.
- Зарегистрируйте интерфейс с помощью RpcServerRegisterIfEx с функцией обратного вызова безопасности; это приведет к тому, что библиотека времени выполнения RPC будет автоматически отклонять вызовы этого интерфейса без проверки подлинности. Регистрация функции обратного вызова совместима с другими методами проверки учетных данных для доступа; функция обратного вызова может вызывать функции RpcImpersonateClient, RpcGetAuthorizationContextForClient, RpcBindingInqAuthClientEx или другие. Однако эти функции не могут использовать аргументы, передаваемые в функцию, так как на этом этапе они не отменяются.
Важно!
Регистрация интерфейса с помощью RpcServerRegisterIfEx с функцией обратного вызова безопасности является наиболее рекомендуемым методом проверки учетных данных клиента.
- Вызовите RpcBindingInqAuthClient , чтобы определить уровень безопасности, который использует клиент. После этого заглушка может вернуть ошибку, если клиент не пройти проверку подлинности.