AuthenticationManager.CustomTargetNameDictionary Propriedade

Definição

Obtém o dicionário que contém SPNs (Nomes de Entidade de Serviço) usados para identificar hosts durante a autenticação Kerberos em solicitações feitas usando WebRequest e suas classes derivadas.

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

Valor da propriedade

Um StringDictionary gravável que contém os valores SPN para chaves compostas por informações do host.

Exemplos

O exemplo de código a seguir demonstra a exibição do conteúdo do 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>

*/

Comentários

Um SPN é um nome pelo qual um cliente identifica exclusivamente uma instância de um serviço ou aplicativo em um servidor para fins de autenticação mútua. A autenticação mútua é solicitada por padrão e você pode exigir isso definindo WebRequest.AuthenticationLevel como MutualAuthRequired em sua solicitação.

Quando um WebRequest requer autenticação mútua, o SPN para o destino deve ser fornecido pelo cliente. Se você souber o SPN, poderá adicioná-lo ao CustomTargetNameDictionary antes de enviar a solicitação. Se você não adicionou informações de SPN a esse dicionário, o AuthenticationManager usa o RequestUri método para compor o SPN mais provável; no entanto, esse é um valor calculado e pode estar incorreto. Se a autenticação mútua for tentada e falhar, você poderá marcar o dicionário para determinar o SPN computado. Nenhum SPN será inserido no dicionário se o protocolo de autenticação não der suporte à autenticação mútua.

Para adicionar um valor SPN a esse dicionário, use o AbsoluteUriRequestUri de como a chave. Internamente, a chave é truncada para incluir o Scheme, Hoste o Port se não for a porta padrão.

Observação

Acessar os métodos e as propriedades do CustomTargetNameDictionary requer irrestrito WebPermission.

Observação

Quando a autenticação Kerberos é executada por meio de um proxy, o proxy e o nome do host final precisam ser resolvidos para um SPN. A resolução de nomes de proxy é protegida por um tempo limite. A resolução do nome de host final para um SPN requer uma pesquisa de DNS e não há tempo limite associado diretamente a essa operação. Portanto, operações síncronas podem levar mais tempo limite. Para superar isso, adicione o prefixo de URI do host final ao cache SPN antes de fazer solicitações a ele.

A versão 3.5 SP1 agora usa como padrão a especificação do nome do host usado na URL da solicitação no SPN da troca de autenticação NTLM (NT LAN Manager) quando a propriedade CustomTargetNameDictionary não está definida. O nome do host usado na URL da solicitação pode ser diferente do cabeçalho de Host especificado na System.Net.HttpRequestHeader na solicitação do cliente. O nome do host usado na URL de solicitação pode ser diferente do nome do host real do servidor, do nome do computador do servidor, do endereço IP do computador ou do endereço de loopback. Nesses casos, o Windows falhará a solicitação de autenticação. Para resolver o problema, talvez seja necessário notificar o Windows de que o nome do host usado na URL de solicitação na solicitação do cliente ("contoso", por exemplo) é, na verdade, um nome alternativo para o computador local.

Aplica-se a

Confira também