AuthenticationManager.CustomTargetNameDictionary Свойство

Определение

Возвращает словарь, содержащий имена участников-служб, которые используются для идентификации узлов во время проверки подлинности Kerberos для запросов, сделанных с использованием класса WebRequest и его производных классов.

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

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

Доступный для записи словарь StringDictionary, который содержит значения имен участников-служб для ключей, состоящих из сведений узла.

Примеры

В следующем примере кода показано отображение содержимого 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>

*/

Комментарии

Имя субъекта-службы — это имя, по которому клиент однозначно идентифицирует экземпляр службы или приложения на сервере в целях взаимной проверки подлинности. Взаимная проверка подлинности запрашивается по умолчанию, и ее можно требовать, задав в запросе значение WebRequest.AuthenticationLevelMutualAuthRequired .

Если требуется взаимная WebRequest проверка подлинности, имя субъекта-службы для назначения должно быть предоставлено клиентом. Если вы знаете имя субъекта-службы, его можно добавить в CustomTargetNameDictionary перед отправкой запроса. Если вы не добавили сведения о имени субъекта-службы в этот словарь, AuthenticationManager метод использует RequestUri метод для составления наиболее вероятного имени субъекта-службы. Однако это вычисленное значение, которое может быть неправильным. Если попытка взаимной проверки подлинности завершается ошибкой, можно проверка словарь, чтобы определить вычисленное имя субъекта-службы. Имя субъекта-службы не вводится в словарь, если протокол проверки подлинности не поддерживает взаимную проверку подлинности.

Чтобы добавить значение имени субъекта-службы в этот словарь, используйте AbsoluteUri в RequestUri качестве ключа . На внутреннем сервере ключ усекается, чтобы включить Scheme, Hostи , Port если он не является портом по умолчанию.

Примечание

Для доступа к методам и свойствам объекта требуется CustomTargetNameDictionary неограниченный WebPermissionдоступ.

Примечание

При проверке подлинности Kerberos через прокси-сервер необходимо разрешить как имя прокси-сервера, так и имя конечного узла в имя субъекта-службы. Разрешение имен прокси-сервера защищено временем ожидания. Для разрешения конечного имени узла в имя субъекта-службы требуется поиск DNS, а время ожидания, связанное непосредственно с этой операцией, не существует. Поэтому время ожидания синхронных операций может занять больше времени. Чтобы устранить эту проблему, добавьте префикс URI конечного узла в кэш имени субъекта-службы перед выполнением запросов к нему.

Если свойство CustomTargetNameDictionary не задано, то при обмене данными для проверки подлинности NTLM в версии 3.5 с пакетом обновления  1 (SP1) в качестве имени субъекта-службы по умолчанию указывается имя узла, используемое в URL-адресе запроса. Имя узла, используемое в URL-адресе запроса, может отличаться от заголовка узла, указанного в System.Net.HttpRequestHeader в запросе клиента. Кроме того, оно может отличаться от фактического имени узла сервера, имени компьютера сервера, IP-адреса компьютера или петлевого адреса. В таких случаях Windows отклонит запрос проверки подлинности. Чтобы устранить эту проблему, может потребоваться уведомить Windows о том, что имя узла, используемое в URL-адресе запроса в запросе клиента (например, contoso), фактически является альтернативным именем локального компьютера.

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

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