AuthenticationManager.CustomTargetNameDictionary Propriété
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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 WebRequest.AuthenticationLevelMutualAuthRequired sur 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 CustomTargetNameDictionary au avant d’envoyer 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 vérifier 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 RequestUri comme clé. En interne, la clé est tronquée pour inclure le Scheme, Hostet le Port s’il ne s’agit pas du port par défaut.
Notes
L’accès aux méthodes et aux propriétés de nécessite CustomTargetNameDictionary 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’attente n’est associé directement à cette opération. Par conséquent, le délai d’attente 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 demande cliente (« contoso », par exemple) est en fait un autre nom pour l’ordinateur local.