AuthenticationManager.CustomTargetNameDictionary Свойство

Определение

Возвращает словарь, содержащий имена участников-служб, которые используются для идентификации узлов во время проверки подлинности Kerberos для запросов, сделанных с использованием класса WebRequest и его производных классов.Gets the dictionary that contains Service Principal Names (SPNs) that are used to identify hosts during Kerberos authentication for requests made using WebRequest and its derived classes.

public:
 static property System::Collections::Specialized::StringDictionary ^ CustomTargetNameDictionary { System::Collections::Specialized::StringDictionary ^ get(); };
public static System.Collections.Specialized.StringDictionary CustomTargetNameDictionary { get; }
member this.CustomTargetNameDictionary : System.Collections.Specialized.StringDictionary
Public Shared ReadOnly Property CustomTargetNameDictionary As StringDictionary

Значение свойства

StringDictionary

Доступный для записи словарь StringDictionary, который содержит значения имен участников-служб для ключей, состоящих из сведений узла.A writable StringDictionary that contains the SPN values for keys composed of host information.

Примеры

В следующем примере кода показано, как отобразить содержимое CustomTargetNameDictionary .The following code example demonstrates displaying the contents of the 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>

*/

Комментарии

Имя участника-службы является именем, по которому клиент однозначно определяет экземпляр службы или приложения на сервере для взаимной проверки подлинности.An SPN is a name by which a client uniquely identifies an instance of a service or application on a server for purposes of mutual authentication. Взаимная проверка подлинности запрашивается по умолчанию, и ее можно запрашивать, задав WebRequest.AuthenticationLevel MutualAuthRequired в запросе.Mutual authentication is requested by default, and you can require it by setting WebRequest.AuthenticationLevel to MutualAuthRequired in your request.

Если для WebRequest требуется взаимная проверка подлинности, то имя участника-службы для назначения должно предоставляться клиентом.When a WebRequest requires mutual authentication, the SPN for the destination must be supplied by the client. Если имя субъекта-службы известно, его можно добавить в CustomTargetNameDictionary перед отправкой запроса.If you know the SPN, you can add it to the CustomTargetNameDictionary before sending the request. Если вы не добавили сведения о имени субъекта-службы в этот словарь, AuthenticationManager компонент использует RequestUri метод для составления наиболее вероятного имени участника-службы, однако это вычисленное значение, которое может быть неправильным.If you have not added SPN information to this dictionary, the AuthenticationManager uses the RequestUri method to compose the most likely SPN; however, this is a computed value and might be incorrect. Если выполняется взаимная проверка подлинности и происходит сбой, можно проверить словарь, чтобы определить вычисленное имя участника-службы.If mutual authentication is attempted and fails, you can check the dictionary to determine the computed SPN. Имя субъекта-службы не указано в словаре, если протокол проверки подлинности не поддерживает взаимную проверку подлинности.No SPN is entered into the dictionary if the authentication protocol does not support mutual authentication.

Чтобы добавить значение имени участника-службы в этот словарь, используйте в AbsoluteUri RequestUri качестве ключа.To add an SPN value to this dictionary, use the AbsoluteUri of the RequestUri as the key. На внутреннем уровне ключ усекается, чтобы включить Scheme , Host и, Port если он не является портом по умолчанию.Internally, the key is truncated to include the Scheme, Host, and the Port if it is not the default port.

Примечание

Для доступа к методам и свойствам объекта CustomTargetNameDictionary требуется неограниченный WebPermission .Accessing the methods and properties of the CustomTargetNameDictionary requires unrestricted WebPermission.

Примечание

Если проверка подлинности Kerberos выполняется через прокси-сервер, то прокси-сервер и конечное имя узла должны быть разрешены в SPN.When Kerberos authentication is performed through a proxy, both the proxy and the ultimate host name need to be resolved to an SPN. Разрешение имени прокси-сервера защищено с помощью времени ожидания.The proxy name resolution is protected by a timeout. Для разрешения максимального имени узла в имя субъекта-службы требуется поиск DNS, и нет времени ожидания, связанного с этой операцией напрямую.Resolution of the ultimate host name to a SPN requires a DNS lookup, and there is no timeout associated directly with this operation. Поэтому синхронные операции могут занять больше времени, чем время ожидания.Therefore synchronous operations may take longer to timeout. Чтобы преодолеть это, добавьте префикс URI конечного узла в кэш имени субъекта-службы перед выполнением запросов к нему.To overcome this, add the ultimate host's URI prefix to the SPN cache prior to making requests to it.

Если свойство CustomTargetNameDictionary не задано, то при обмене данными для проверки подлинности NTLM в версии 3.5 с пакетом обновления  1 (SP1) в качестве имени субъекта-службы по умолчанию указывается имя узла, используемое в URL-адресе запроса.Version 3.5 SP1 now defaults to specifying the host name used in the request URL in the SPN in the NTLM (NT LAN Manager) authentication exchange when the CustomTargetNameDictionary property is not set. Имя узла, используемое в URL-адресе запроса, может отличаться от заголовка узла, указанного в System.Net.HttpRequestHeader в запросе клиента.The host name used in the request URL may be different from the Host header specified in the System.Net.HttpRequestHeader in the client request. Кроме того, оно может отличаться от фактического имени узла сервера, имени компьютера сервера, IP-адреса компьютера или петлевого адреса.The host name used in the request URL may be different from the actual host name of the server, the machine name of the server, the computer's IP address, or the loopback address. В таких случаях Windows отклонит запрос проверки подлинности.In these cases, Windows will fail the authentication request. Чтобы устранить эту ошибку, может потребоваться уведомление Windows о том, что имя узла, используемое в URL-адресе запроса в запросе клиента (например, Contoso), на самом деле является альтернативным именем локального компьютера.To address the issue, you may need to notify Windows that the host name used in the request URL in the client request ("contoso", for example) is actually an alternate name for the local computer.

Применяется к

См. также раздел