Écriture d’un serveur SSPI authentifié
Avant que la communication authentifiée puisse avoir lieu entre le client et les programmes serveur, le serveur doit inscrire ses informations d’authentification. En particulier, le serveur doit inscrire son nom principal et spécifier le service d’authentification qu’il utilise. Pour plus d’informations sur les noms de principaux, consultez Noms principaux. Pour plus d’informations sur les services d’authentification, consultez Services d’authentification.
Pour inscrire ses informations d’authentification, les serveurs appellent la fonction RpcServerRegisterAuthInfo . Passez un pointeur vers le nom du principal comme valeur du premier paramètre. Définissez le deuxième paramètre sur une constante indiquant le service d’authentification que l’application utilisera. Pour obtenir une description des services d’authentification, consultez Authentication-Service Constants.
Le serveur peut également passer l’adresse d’une fonction d’acquisition de clé comme valeur du troisième paramètre. Consultez Fonctions d’acquisition de clés. Pour utiliser la fonction d’acquisition de clé par défaut pour le service d’authentification sélectionné, définissez le troisième paramètre sur NULL. Le dernier paramètre de la fonction RpcServerRegisterAuthInfo est un pointeur à transmettre à la fonction d’acquisition de clé, si vous fournissez une fonction d’acquisition de clé. Un appel à RpcServerRegisterAuthInfo est affiché dans le fragment de code suivant.
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
En outre, le serveur peut fournir à la bibliothèque d’exécution RPC une fonction d’autorisation. Pour définir une fonction d’autorisation, appelez la fonction RpcMgmtSetAuthorizationFn .
La partie serveur d’une application distribuée peut appeler la fonction RpcBindingInqAuthClient ou RpcBindingInqAuthClientEx pour interroger un handle de liaison pour obtenir des informations d’authentification.
Si votre serveur s’inscrit auprès d’un fournisseur de support de sécurité, les appels clients avec des informations d’identification non valides ne sont pas distribués. Toutefois, les appels sans informations d’identification seront distribués. Il existe trois façons d’éviter ce problème :
- Inscrivez l’interface à l’aide de RpcServerRegisterIfEx, avec une fonction de rappel de sécurité ; Cela entraîne le rejet automatique des appels non authentifiés à cette interface par la bibliothèque d’exécution RPC. L’inscription d’une fonction de rappel est compatible avec d’autres méthodes de vérification des informations d’identification d’accès ; La fonction de rappel peut elle-même appeler les fonctions RpcImpersonateClient, RpcGetAuthorizationContextForClient, RpcBindingInqAuthClientEx ou d’autres fonctions. Toutefois, ces fonctions ne peuvent pas utiliser les arguments passés à la fonction, car elles ne sont pas démarchées à ce stade.
Important
L’inscription de l’interface à l’aide de RpcServerRegisterIfEx avec une fonction de rappel de sécurité est la méthode la plus fortement recommandée pour vérifier les informations d’identification du client.
- Appelez RpcBindingInqAuthClient pour déterminer le niveau de sécurité utilisé par le client. Votre stub peut ensuite retourner une erreur si le client n’est pas authentifié.