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), фактически является альтернативным именем локального компьютера.