Sdílet prostřednictvím


AuthenticationManager.CustomTargetNameDictionary Vlastnost

Definice

Získá slovník, který obsahuje hlavní názvy služby (SPN), které se používají k identifikaci hostitelů během ověřování protokolu Kerberos pro požadavky prováděné pomocí WebRequest a jeho odvozené třídy.

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

Hodnota vlastnosti

Zapisovatelný StringDictionary objekt, který obsahuje hodnoty hlavního názvu služby (SPN) pro klíče skládající se z informací o hostiteli.

Příklady

Následující příklad kódu ukazuje zobrazení obsahu objektu 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>

*/

Poznámky

Hlavní název služby (SPN) je název, podle kterého klient jednoznačně identifikuje instanci služby nebo aplikace na serveru pro účely vzájemného ověřování. Ve výchozím nastavení se vyžaduje vzájemné ověřování a můžete ho vyžadovat nastavením WebRequest.AuthenticationLevel na ve své žádosti na MutualAuthRequired .

Pokud vyžaduje WebRequest vzájemné ověřování, musí klient zadat hlavní název služby pro cíl. Pokud hlavní název služby znáte, můžete ho CustomTargetNameDictionary před odesláním žádosti přidat do hlavního názvu služby. Pokud jste do tohoto slovníku nepřidali informace o hlavním názvu služby ( AuthenticationManager SPN), použije RequestUri metoda k vytvoření nejpravděpodobnějšího hlavního názvu služby (SPN). Jedná se však o počítanou hodnotu a může být nesprávná. Pokud dojde k pokusu o vzájemné ověření a selže, můžete zkontrolovat slovník a určit vypočítaný hlavní název služby (SPN). Pokud ověřovací protokol nepodporuje vzájemné ověřování, nezadává se do slovníku žádný hlavní název služby (SPN).

Pokud chcete do tohoto slovníku přidat hodnotu SPN, použijte AbsoluteUri jako klíč hodnotu s názvem RequestUri . Interně je klíč zkrácen tak, aby zahrnoval Scheme, Hosta pokud Port se nejedná o výchozí port.

Poznámka

Přístup k metodám a vlastnostem objektu CustomTargetNameDictionary vyžaduje neomezený WebPermissionpřístup .

Poznámka

Pokud se ověřování protokolem Kerberos provádí prostřednictvím proxy serveru, musí být proxy server i konečný název hostitele přeložen na hlavní název služby (SPN). Překlad názvů proxy serveru je chráněný vypršením časového limitu. Překlad konečného názvu hostitele na hlavní název služby (SPN) vyžaduje vyhledávání DNS a k této operaci není přímo přidružen žádný časový limit. Proto může vypršení časového limitu synchronních operací trvat déle. Chcete-li tento postup vyřešit, přidejte předponu identifikátoru URI konečného hostitele do mezipaměti hlavního názvu služby (SPN) před tím, než na ni vytvoříte požadavky.

Verze 3.5 SP1 nyní ve výchozím nastavení určuje název hostitele použitý v adrese URL požadavku v hlavním názvu služby (SPN) v ověřovací výměně NTLM (NT LAN Manager), pokud CustomTargetNameDictionary není vlastnost nastavena. Název hostitele použitý v adrese URL požadavku se může lišit od hlavičky hostitele zadané v System.Net.HttpRequestHeader požadavku klienta. Název hostitele použitý v adrese URL požadavku se může lišit od skutečného názvu hostitele serveru, názvu počítače serveru, IP adresy počítače nebo adresy zpětné smyčky. V těchto případech systém Windows žádost o ověření nezdaří. Pokud chcete tento problém vyřešit, možná budete muset systém Windows upozornit, že název hostitele použitý v adrese URL požadavku v požadavku klienta (například contoso) je ve skutečnosti alternativním názvem místního počítače.

Platí pro

Viz také