AuthenticationManager.CustomTargetNameDictionary Propriété

Définition

Obtient le dictionnaire qui contient des noms de principaux du service (Service Principal Names, SPN) utilisés pour identifier des hôtes pendant l’authentification Kerberos pour les demandes effectuées à l’aide de WebRequest et de ses classes dérivées.

public:
 static property System::Collections::Specialized::StringDictionary ^ CustomTargetNameDictionary { System::Collections::Specialized::StringDictionary ^ get(); };
public static System.Collections.Specialized.StringDictionary CustomTargetNameDictionary { get; }
static member CustomTargetNameDictionary : System.Collections.Specialized.StringDictionary
Public Shared ReadOnly Property CustomTargetNameDictionary As StringDictionary

Valeur de propriété

StringDictionary accessible en écriture qui contient les valeurs SPN des clés composées d'informations hôte.

Exemples

L’exemple de code suivant illustre l’affichage du contenu de .CustomTargetNameDictionary

static void RequestResource( Uri^ resource )
{
   // Set policy to send credentials when using HTTPS and basic authentication.
   // Create a new HttpWebRequest object for the specified resource.
   WebRequest^ request = dynamic_cast<WebRequest^>(WebRequest::Create( resource ));

   // Supply client credentials for basic authentication.
   request->UseDefaultCredentials = true;
   request->AuthenticationLevel = AuthenticationLevel::MutualAuthRequired;
   HttpWebResponse^ response = dynamic_cast<HttpWebResponse^>(request->GetResponse());

   // Determine mutual authentication was used.
   Console::WriteLine( L"Is mutually authenticated? {0}", response->IsMutuallyAuthenticated );
   System::Collections::Specialized::StringDictionary^ spnDictionary = AuthenticationManager::CustomTargetNameDictionary;
   System::Collections::IEnumerator^ myEnum = spnDictionary->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      DictionaryEntry^ e = safe_cast<DictionaryEntry^>(myEnum->Current);
      Console::WriteLine( "Key: {0}  - {1}", dynamic_cast<String^>(e->Key), dynamic_cast<String^>(e->Value) );
   }

   // Read and display the response.
   System::IO::Stream^ streamResponse = response->GetResponseStream();
   System::IO::StreamReader^ streamRead = gcnew System::IO::StreamReader( streamResponse );
   String^ responseString = streamRead->ReadToEnd();
   Console::WriteLine( responseString );

   // Close the stream objects.
   streamResponse->Close();
   streamRead->Close();

   // Release the HttpWebResponse.
   response->Close();
}

/*

The output from this example will differ based on the requested resource
and whether mutual authentication was successful. For the purpose of illustration,
a sample of the output is shown here:

Is mutually authenticated? True
Key: http://server1.someDomain.contoso.com  - HTTP/server1.someDomain.contoso.com

<html>
...
</html>

*/
       public static void RequestResource(Uri resource)
        {
            // Set policy to send credentials when using HTTPS and basic authentication.

            // Create a new HttpWebRequest object for the specified resource.
            WebRequest request=(WebRequest) WebRequest.Create(resource);
            // Supply client credentials for basic authentication.
            request.UseDefaultCredentials = true;
            request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
            HttpWebResponse response = (HttpWebResponse) request.GetResponse();
            // Determine mutual authentication was used.
            Console.WriteLine("Is mutually authenticated? {0}", response.IsMutuallyAuthenticated);

             System.Collections.Specialized.StringDictionary spnDictionary = AuthenticationManager.CustomTargetNameDictionary;
            foreach (System.Collections.DictionaryEntry e in spnDictionary)
            {
                Console.WriteLine("Key: {0}  - {1}", e.Key as string, e.Value as string);
            }
            // Read and display the response.
            System.IO.Stream streamResponse = response.GetResponseStream();
            System.IO.StreamReader streamRead = new System.IO.StreamReader(streamResponse);
            string responseString = streamRead.ReadToEnd();
            Console.WriteLine(responseString);
            // Close the stream objects.
            streamResponse.Close();
            streamRead.Close();
            // Release the HttpWebResponse.
            response.Close();
        }

/*

The output from this example will differ based on the requested resource
and whether mutual authentication was successful. For the purpose of illustration,
a sample of the output is shown here:

Is mutually authenticated? True
Key: http://server1.someDomain.contoso.com  - HTTP/server1.someDomain.contoso.com

<html>
...
</html>

*/

Remarques

Un SPN est un nom par lequel un client identifie de manière unique une instance d’un service ou d’une application sur un serveur à des fins d’authentification mutuelle. L’authentification mutuelle est demandée par défaut, et vous pouvez l’exiger en définissant sur WebRequest.AuthenticationLevelMutualAuthRequired dans votre demande.

Lorsqu’un nécessite une WebRequest authentification mutuelle, le SPN de la destination doit être fourni par le client. Si vous connaissez le SPN, vous pouvez l’ajouter à avant d’envoyer CustomTargetNameDictionary la demande. Si vous n’avez pas ajouté d’informations spN à ce dictionnaire, le AuthenticationManager utilise la RequestUri méthode pour composer le SPN le plus probable. Toutefois, il s’agit d’une valeur calculée et peut être incorrecte. Si l’authentification mutuelle est tentée et échoue, vous pouvez case activée le dictionnaire pour déterminer le SPN calculé. Aucun SPN n’est entré dans le dictionnaire si le protocole d’authentification ne prend pas en charge l’authentification mutuelle.

Pour ajouter une valeur SPN à ce dictionnaire, utilisez le AbsoluteUri de comme RequestUri clé. En interne, la clé est tronquée pour inclure le Scheme, Hostet si Port ce n’est pas le port par défaut.

Notes

L’accès aux méthodes et propriétés du CustomTargetNameDictionary nécessite une restriction.WebPermission

Notes

Lorsque l’authentification Kerberos est effectuée via un proxy, le proxy et le nom d’hôte final doivent être résolus en spN. La résolution de noms de proxy est protégée par un délai d’expiration. La résolution du nom d’hôte final à un SPN nécessite une recherche DNS, et aucun délai d’expiration n’est associé directement à cette opération. Par conséquent, le délai d’expiration des opérations synchrones peut prendre plus de temps. Pour résoudre ce problème, ajoutez le préfixe d’URI de l’hôte final au cache SPN avant d’y effectuer des demandes.

La version 3.5 SP1 spécifie désormais par défaut le nom d’hôte utilisé dans l’URL de requête dans le SPN lors de l’échange d’authentification NTLM (NT LAN Manager) quand la propriété CustomTargetNameDictionary n’est pas définie. Le nom d’hôte utilisé dans l’URL de requête peut être différent de l’en-tête d’hôte spécifié dans System.Net.HttpRequestHeader dans la requête du client. Le nom d’hôte utilisé dans l’URL de requête peut être différent du nom d’hôte réel du serveur, du nom d’ordinateur du serveur, de l’adresse IP de l’ordinateur ou de l’adresse de bouclage. Dans ce cas, Windows fait échouer la requête d’authentification. Pour résoudre le problème, vous devrez peut-être informer Windows que le nom d’hôte utilisé dans l’URL de la requête du client (« contoso », par exemple) est en fait un autre nom pour l’ordinateur local.

S’applique à

Voir aussi