AuthenticationManager.CustomTargetNameDictionary Właściwość

Definicja

Pobiera słownik zawierający główne nazwy usługi (SPN) używane do identyfikowania hostów podczas uwierzytelniania Kerberos dla żądań wykonanych 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

Zapis StringDictionary zawierający wartości NAZWY SPN dla kluczy składających się z informacji o hoście.

Przykłady

W poniższym przykładzie kodu pokazano zawartość elementu 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. Żądanie wzajemnego uwierzytelniania jest domyślnie wymagane i można go wymagać, ustawiając WebRequest.AuthenticationLevel wartość na MutualAuthRequired w żądaniu.

Jeśli wymaga WebRequest wzajemnego uwierzytelniania, nazwa SPN dla miejsca docelowego musi zostać dostarczona przez klienta. Jeśli znasz nazwę SPN, możesz dodać ją do obiektu CustomTargetNameDictionary przed wysłaniem żądania. Jeśli do tego słownika nie dodano informacji o nazwie SPN, AuthenticationManager metoda używa RequestUri metody do tworzenia najbardziej prawdopodobnej nazwy SPN. Jest to jednak 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. W słowniku nie jest wprowadzana żadna nazwa SPN, jeśli protokół uwierzytelniania nie obsługuje wzajemnego uwierzytelniania.

Aby dodać wartość nazwy SPN do tego słownika, użyj AbsoluteUriRequestUri wartości jako klucza. Wewnętrznie klucz jest obcięty w celu uwzględnienia Schemeelementu , Hosti Port , jeśli nie jest to port domyślny.

Uwaga

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

Uwaga

Gdy uwierzytelnianie Kerberos jest wykonywane za pośrednictwem serwera proxy, zarówno serwer proxy, jak i ostateczną nazwę hosta należy rozpoznać jako nazwę SPN. Rozpoznawanie nazw serwera proxy jest chronione przez limit czasu. Rozpoznawanie ostatecznej nazwy hosta do nazwy SPN wymaga wyszukiwania DNS i nie ma limitu czasu skojarzonego bezpośrednio z tą operacją. W związku z tym operacje synchroniczne mogą trwać dłużej, aby przekraczać limit czasu. Aby rozwiązać ten problem, dodaj prefiks identyfikatora URI hosta do pamięci podręcznej SPN przed wykonaniem do niego żądań.

Wersja 3.5 z dodatkiem SP1 domyślnie określa nazwę hosta używaną w adresie URL żądania w nazwie SPN w ramach wymiany uwierzytelniania NTLM (NT LAN Manager), gdy CustomTargetNameDictionary właściwość nie jest ustawiona. Nazwa hosta używana w adresie URL żądania może być inna niż nagłówek hosta określony w System.Net.HttpRequestHeader żą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 uwierzytelniania. Aby rozwiązać ten problem, może być konieczne powiadomienie systemu Windows o tym, ż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ż