Поделиться через


Запись сервера 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 , чтобы определить уровень безопасности, который использует клиент. После этого заглушка может вернуть ошибку, если клиент не пройти проверку подлинности.