Udostępnij za pośrednictwem


AuthenticationManager.CustomTargetNameDictionary Właściwość

Definicja

Pobiera słownik zawierający główne nazwy usług (SPN), które są używane do identyfikowania hostów podczas uwierzytelniania Kerberos dla żądań wysyłanych przy użyciu WebRequest i jej klas pochodnych.

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

Wartość właściwości

Zapisywalny StringDictionary , który zawiera wartości nazwy SPN kluczy składających się z informacji o hoście.

Przykłady

Poniższy przykład kodu przedstawia wyświetlanie zawartości obiektu 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>

*/

Uwagi

Nazwa SPN to nazwa, za pomocą której klient jednoznacznie identyfikuje wystąpienie usługi lub aplikacji na serwerze na potrzeby wzajemnego uwierzytelniania. Uwierzytelnianie wzajemne jest domyślnie wymagane i można go wymagać, ustawiając wartość WebRequest.AuthenticationLevelMutualAuthRequired na w żądaniu.

Jeśli element WebRequest wymaga wzajemnego uwierzytelniania, nazwa SPN dla miejsca docelowego musi być dostarczana przez klienta. Jeśli znasz nazwę SPN, możesz dodać ją do obiektu CustomTargetNameDictionary przed wysłaniem żądania. Jeśli nie dodano informacji o nazwie SPN do tego słownika, AuthenticationManager metoda używa RequestUri metody do redagowania najbardziej prawdopodobnej nazwy SPN, jednak jest to obliczona wartość i może być niepoprawna. Jeśli próba wzajemnego uwierzytelniania zakończy się niepowodzeniem, możesz sprawdzić słownik, aby określić obliczoną nazwę SPN. Żadna nazwa SPN nie jest wprowadzana do słownika, jeśli protokół uwierzytelniania nie obsługuje wzajemnego uwierzytelniania.

Aby dodać wartość NAZWY SPN do tego słownika, użyj AbsoluteUriRequestUri elementu jako klucza. Klucz jest obcinany wewnętrznie w celu uwzględnienia Scheme, Hosti Port , jeśli nie jest portem domyślnym.

Uwaga

Uzyskiwanie dostępu do metod i właściwości obiektu wymaga nieograniczonego CustomTargetNameDictionary elementu WebPermission.

Uwaga

Gdy uwierzytelnianie Kerberos odbywa się za pośrednictwem serwera proxy, zarówno serwer proxy, jak i ostateczna nazwa hosta muszą zostać rozpoznane jako nazwa SPN. Rozpoznawanie nazw serwera proxy jest chronione przez limit czasu. Rozpoznawanie ostatecznej nazwy hosta dla nazwy SPN wymaga wyszukiwania DNS i nie ma limitu czasu skojarzonego bezpośrednio z tą operacją. W związku z tym operacje synchroniczne mogą zająć więcej czasu. Aby rozwiązać ten problem, dodaj prefiks identyfikatora URI URI ostatecznego hosta do pamięci podręcznej spN przed wykonaniem do niego żądań.

Wersja 3.5 SP1 teraz domyślnie określa nazwę hosta używaną w adresie URL żądania w nazwie SPN w programie wymiany uwierzytelniania NTLM (NT LAN Manager), gdy CustomTargetNameDictionary właściwość nie jest ustawiona. Nazwa hosta używana w adresie URL żądania może różnić się od nagłówka Hosta określonego System.Net.HttpRequestHeader w żądaniu klienta. Nazwa hosta używana w adresie URL żądania może być inna niż rzeczywista nazwa hosta serwera, nazwa komputera serwera, adres IP komputera lub adres sprzężenia zwrotnego. W takich przypadkach system Windows zakończy się niepowodzeniem żądania uwierzytelnienia. Aby rozwiązać ten problem, może być konieczne powiadomienie systemu Windows, że nazwa hosta używana w adresie URL żądania w żądaniu klienta ("contoso", na przykład) jest w rzeczywistości alternatywną nazwą komputera lokalnego.

Dotyczy

Zobacz też