Freigeben über


AuthenticationManager.CustomTargetNameDictionary Eigenschaft

Definition

Ruft das Wörterbuch ab, das SPNs (Service Principal Names) enthält. Diese werden während der Kerberos-Authentifizierung zum Identifizieren von Hosts für Anforderungen verwendet, die mit WebRequest und den abgeleiteten Klassen ausgeführt werden.

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

Eigenschaftswert

Ein nicht schreibgeschütztes StringDictionary, das die SPN-Werte für aus Hostinformationen bestehende Schlüssel enthält.

Beispiele

Im folgenden Codebeispiel wird die Anzeige des Inhalts veranschaulicht 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>

*/

Hinweise

Ein SPN ist ein Name, mit dem ein Client eine Instanz eines Diensts oder einer Anwendung auf einem Server für zwecke der gegenseitigen Authentifizierung eindeutig identifiziert. Die gegenseitige Authentifizierung wird standardmäßig angefordert, und Sie können sie anfordern, indem Sie in Ihrer Anforderung auf MutualAuthRequired festlegenWebRequest.AuthenticationLevel.

Wenn eine WebRequest gegenseitige Authentifizierung erfordert, muss der SPN für das Ziel vom Client bereitgestellt werden. Wenn Sie den SPN kennen, können Sie ihn dem hinzufügen, CustomTargetNameDictionary bevor Sie die Anforderung senden. Wenn Sie diesem Wörterbuch keine SPN-Informationen hinzugefügt haben, verwendet die AuthenticationManagerRequestUri -Methode, um den wahrscheinlichsten SPN zu erstellen. Dies ist jedoch ein berechneter Wert und möglicherweise falsch. Wenn die gegenseitige Authentifizierung versucht wird und ein Fehler auftritt, können Sie das Wörterbuch überprüfen, um den berechneten SPN zu ermitteln. Es wird kein SPN in das Wörterbuch eingegeben, wenn das Authentifizierungsprotokoll die gegenseitige Authentifizierung nicht unterstützt.

Um diesem Wörterbuch einen SPN-Wert hinzuzufügen, verwenden Sie den AbsoluteUri von RequestUri als Schlüssel. Intern wird der Schlüssel abgeschnitten, um den Scheme, Hostund den Port einzuschließen, wenn es sich nicht um den Standardport handelt.

Hinweis

Für den Zugriff auf die Methoden und Eigenschaften von CustomTargetNameDictionary ist uneingeschränkt WebPermissionerforderlich.

Hinweis

Wenn die Kerberos-Authentifizierung über einen Proxy ausgeführt wird, müssen sowohl der Proxy als auch der endgültige Hostname in einen SPN aufgelöst werden. Die Proxynamenauflösung wird durch ein Timeout geschützt. Die Auflösung des ultimativen Hostnamens zu einem SPN erfordert eine DNS-Suche, und diesem Vorgang ist kein timeout direkt zugeordnet. Daher kann das Timeout bei synchronen Vorgängen länger dauern. Um dies zu umgehen, fügen Sie dem SPN-Cache das URI-Präfix des ultimativen Hosts hinzu, bevor Anforderungen an ihn gesendet werden.

Version 3.5 SP1 gibt jetzt standardmäßig den Hostnamen in der Anforderungs-URL in der SPN im NTLM-Authentifizierungsaustausch (NT LAN Manager) an, wenn die CustomTargetNameDictionary-Eigenschaft nicht festgelegt ist. Der Hostname in der Anforderungs-URL kann vom in System.Net.HttpRequestHeader in der Clientanforderung angegebenen Hostheader abweichen. Der Hostname in der Anforderungs-URL kann vom tatsächlichen Hostnamen des Servers, dem Computernamen des Servers, der IP-Adresse des Computers oder der Loopbackadresse abweichen. In diesen Fällen schlägt die Authentifizierungsanforderung in Windows fehl. Um das Problem zu beheben, müssen Sie Windows möglicherweise benachrichtigen, dass der hostname, der in der Anforderungs-URL in der Clientanforderung ("contoso" z. B. ) verwendet wird, tatsächlich ein alternativer Name für den lokalen Computer ist.

Gilt für:

Weitere Informationen