Condividi tramite


AuthenticationManager.CustomTargetNameDictionary Proprietà

Definizione

Ottiene il dizionario che contiene l'SPN (Service Principal Name, Nome principale servizio) utilizzato per identificare gli host durante l'autenticazione Kerberos per le richieste mediante WebRequest e le relative classi derivate.

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

Valore della proprietà

Classe StringDictionary modificabile che contiene i valori SPN per chiavi composte di informazioni sull'host.

Esempio

Nell'esempio di codice seguente viene illustrato come visualizzare il contenuto di 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>

*/

Commenti

Un nome SPN è un nome in base al quale un client identifica in modo univoco un'istanza di un servizio o di un'applicazione in un server ai fini dell'autenticazione reciproca. L'autenticazione reciproca viene richiesta per impostazione predefinita ed è possibile richiederla impostando WebRequest.AuthenticationLevel su MutualAuthRequired nella richiesta.

Quando un WebRequest oggetto richiede l'autenticazione reciproca, il nome SPN per la destinazione deve essere fornito dal client. Se si conosce il nome SPN, è possibile aggiungerlo a CustomTargetNameDictionary prima di inviare la richiesta. Se non sono state aggiunte informazioni SPN a questo dizionario, il AuthenticationManager metodo usa il RequestUri metodo per comporre il nome SPN più probabile. Tuttavia, si tratta di un valore calcolato e potrebbe non essere corretto. Se l'autenticazione reciproca viene tentata e ha esito negativo, è possibile controllare il dizionario per determinare il nome SPN calcolato. Nessun nome SPN viene immesso nel dizionario se il protocollo di autenticazione non supporta l'autenticazione reciproca.

Per aggiungere un valore SPN a questo dizionario, usare l'oggetto AbsoluteUriRequestUri di come chiave. Internamente, la chiave viene troncata per includere Scheme, Hoste se Port non è la porta predefinita.

Nota

L'accesso ai metodi e alle proprietà di richiede CustomTargetNameDictionary un numero illimitato WebPermissiondi .

Nota

Quando l'autenticazione Kerberos viene eseguita tramite un proxy, è necessario risolvere sia il proxy che il nome host finale in un nome SPN. La risoluzione dei nomi proxy è protetta da un timeout. La risoluzione del nome host finale a un nome SPN richiede una ricerca DNS e non è presente alcun timeout associato direttamente a questa operazione. Pertanto, le operazioni sincrone potrebbero richiedere più tempo per il timeout. Per risolvere questo problema, aggiungere il prefisso URI dell'host finale alla cache SPN prima di effettuare richieste.

Nella versione 3.5 SP1, quando la proprietà CustomTargetNameDictionary non è impostata, come stringa SPN nello scambio di autenticazione NTLM (NT LAN Manager) viene specificato per impostazione predefinita il nome host usato nell'URL della richiesta. Il nome host usato nell'URL della richiesta può essere diverso dall'intestazione Host specificata in System.Net.HttpRequestHeader nella richiesta del client. Il nome host usato nell'URL della richiesta può essere diverso dal nome host effettivo del server, dal nome computer del server, dall'indirizzo IP del computer o dall'indirizzo di loopback. In questi casi la richiesta di autenticazione in Windows ha esito negativo. Per risolvere il problema, potrebbe essere necessario notificare a Windows che il nome host usato nell'URL della richiesta del client ("contoso", ad esempio) è effettivamente un nome alternativo per il computer locale.

Si applica a

Vedi anche