Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Foram feitas melhorias que afetam a forma como a autenticação integrada do Windows é tratada pelas classes HttpWebRequest, HttpListener, SmtpClient, SslStream, NegotiateStream e classes relacionadas nos namespaces System.Net e relacionados. Foi adicionado suporte para proteção estendida para aprimorar a segurança.
Essas alterações podem afetar aplicativos que usam essas classes para fazer solicitações da Web e receber respostas em que a autenticação integrada do Windows é usada. Essa alteração também pode afetar servidores Web e aplicativos cliente configurados para usar a autenticação integrada do Windows.
Essas alterações também podem afetar aplicativos que usam essas classes para fazer outros tipos de solicitações e receber respostas em que a autenticação integrada do Windows é usada.
As alterações para dar suporte à proteção estendida estão disponíveis apenas para aplicativos no Windows 7 e no Windows Server 2008 R2. Os recursos de proteção estendida não estão disponíveis em versões anteriores do Windows.
Visão geral
O design da autenticação integrada do Windows permite que algumas das respostas aos desafios de credenciais sejam universais, o que significa que elas podem ser reutilizadas ou encaminhadas. As respostas de desafio devem ser construídas com, no mínimo, informações específicas para o público-alvo e, de preferência, também algumas informações específicas do canal. Serviços podem fornecer proteção adicional para garantir que respostas ao desafio de credenciamento contenham informações específicas do serviço, como um Nome Principal de Serviço (SPN). Com essas informações nas trocas de credenciais, os serviços são capazes de proteger melhor contra o uso mal-intencionado de respostas de desafio de credencial que podem ter sido usadas incorretamente.
O design de proteção estendida é um aprimoramento dos protocolos de autenticação projetados para mitigar ataques de retransmissão de autenticação. Ele gira em torno do conceito de informações de associação de serviço/canal.
Os objetivos gerais são os seguintes:
Se o cliente for atualizado para dar suporte à proteção estendida, os aplicativos deverão fornecer uma associação de canal e informações de associação de serviço a todos os protocolos de autenticação com suporte. As informações de associação de canal só podem ser fornecidas quando há um canal (TLS) ao qual associar. Informações de associação de serviço sempre devem ser fornecidas.
Os servidores atualizados configurados corretamente podem verificar as informações de associação de canal e serviço quando estiverem presentes no token de autenticação do cliente e rejeitar a tentativa de autenticação se as associações de canal não corresponderem. Dependendo do cenário de implantação, os servidores podem verificar a associação de canal, a associação de serviço ou ambos.
Os servidores atualizados têm a capacidade de aceitar ou rejeitar solicitações de cliente de nível inferior que não contêm as informações de associação de canal com base na política.
As informações usadas pela proteção estendida consistem em uma ou ambas as duas partes a seguir:
Um token de associação de canal ou CBT.
Informações de associação de serviço na forma de um nome da entidade de serviço ou SPN.
Informações de associação de serviço são uma indicação da intenção do cliente para autenticar para um ponto de extremidade de serviço específico. Ele é comunicado de cliente para servidor com as seguintes propriedades:
O valor de SPN deve estar disponível para o servidor que executa a autenticação do cliente em um formulário de texto claro.
O valor do SPN é público.
O SPN deve ser protegido criptograficamente em trânsito, de modo que um ataque man-in-the-middle não possa inserir, remover ou modificar seu valor.
Um CBT é uma propriedade do canal seguro externo (como TLS) usado para vinculá-lo (associá-lo) a uma conversa por meio de um canal interno autenticado pelo cliente. O CBT deve ter as seguintes propriedades (também definidas pelo IETF RFC 5056):
Quando existe um canal externo, o valor do CBT deve ser uma propriedade que identifique tanto o canal externo quanto o ponto de extremidade do servidor, determinada de forma independente pelos lados do cliente e do servidor em uma conversa.
O valor do CBT enviado pelo cliente não deve ser algo que um invasor pode influenciar.
Não há garantias sobre sigilo do valor de CBT. Isso não significa, no entanto, que o valor da associação de serviço e as informações de associação de canal possam sempre ser examinados por alguém além do servidor que realiza a autenticação, pois o protocolo que transporta o CBT pode estar criptografando-os.
O CBT deve ter sua integridade protegida criptograficamente durante o trânsito, de modo que um atacante não possa inserir, remover ou modificar seu valor.
A associação de canal é realizada pelo cliente transferindo o SPN e o CBT para o servidor de maneira inviolável. O servidor valida as informações de associação de canal de acordo com sua política e rejeita tentativas de autenticação cujo destino pretendido ele não acredita ter sido ele mesmo. Dessa forma, os dois canais se tornam conectados criptograficamente.
Para preservar a compatibilidade com clientes e aplicativos existentes, um servidor pode ser configurado para permitir tentativas de autenticação por clientes que ainda não dão suporte à proteção estendida. Isso é conhecido como uma configuração "parcialmente protegida", em contraste com uma configuração "totalmente protegida".
Os múltiplos componentes nos namespaces System.Net e System.Net.Security executam a autenticação integrada do Windows em nome de um aplicativo chamador. Esta seção descreve as alterações nos componentes System.Net para adicionar proteção estendida no uso da autenticação integrada do Windows.
Atualmente, há suporte para proteção estendida no Windows 7. Um mecanismo é fornecido para que um aplicativo possa determinar se o sistema operacional dá suporte à proteção estendida.
Alterações no suporte à proteção estendida
O processo de autenticação usado com a autenticação integrada do Windows, dependendo do protocolo de autenticação usado, geralmente inclui um desafio emitido pelo computador de destino e enviado de volta para o computador cliente. A proteção estendida adiciona novos recursos a esse processo de autenticação
O System.Security.Authentication.ExtendedProtection namespace fornece suporte para autenticação usando proteção estendida para aplicativos. A ChannelBinding classe nesse namespace representa uma associação de canal. A ExtendedProtectionPolicy classe nesse namespace representa a política de proteção estendida usada pelo servidor para validar conexões de cliente de entrada. Outros membros de classe são usados com proteção estendida.
Para aplicativos de servidor, essas classes incluem o seguinte:
Um ExtendedProtectionPolicy que tem os seguintes elementos:
Uma OSSupportsExtendedProtection propriedade que indica se o sistema operacional dá suporte à autenticação integrada do Windows com proteção estendida.
Um PolicyEnforcement valor que indica quando a política de proteção estendida deve ser imposta.
Um ProtectionScenario valor que indica o cenário de implantação. Isso influencia a forma como a proteção estendida é verificada.
Um ServiceNameCollection opcional que contém a lista de SPN personalizada que é usada para fazer a correspondência com o SPN fornecido pelo cliente como o destino pretendido da autenticação.
Um ChannelBinding opcional que contém uma associação de canal personalizada a ser usada para validação. Esse cenário não é um caso comum
O System.Security.Authentication.ExtendedProtection.Configuration namespace fornece suporte para a configuração da autenticação usando a proteção estendida para aplicativos.
Várias alterações de recursos foram feitas para dar suporte à proteção estendida no namespace existente System.Net . Essas alterações incluem o seguinte:
Uma nova TransportContext classe adicionada ao System.Net namespace que representa um contexto de transporte.
Novos métodos de sobrecarga EndGetRequestStream e GetRequestStream na classe HttpWebRequest que permitem recuperar o TransportContext para dar suporte à proteção estendida para aplicativos cliente.
Adições às classes HttpListener e HttpListenerRequest para dar suporte a aplicativos de servidor.
Foi feita uma alteração de recurso para dar suporte à proteção estendida para aplicativos cliente SMTP no namespace existente System.Net.Mail :
- Uma TargetName propriedade na SmtpClient classe que representa o SPN a ser usado para autenticação ao usar a proteção estendida para aplicativos cliente SMTP.
Várias alterações de recursos foram feitas para dar suporte à proteção estendida no namespace existente System.Net.Security . Essas alterações incluem o seguinte:
Novos métodos de sobrecarga BeginAuthenticateAsClient e AuthenticateAsClient na classe NegotiateStream que permitem passar um CBT para dar suporte à proteção estendida para aplicativos cliente.
Novos métodos de sobrecarga BeginAuthenticateAsServer e AuthenticateAsServer na classe NegotiateStream que permitem passar um ExtendedProtectionPolicy para dar suporte à proteção estendida para aplicativos para servidores.
Uma nova TransportContext propriedade na SslStream classe para dar suporte à proteção estendida para aplicativos cliente e servidor.
Uma SmtpNetworkElement propriedade foi adicionada para dar suporte à configuração de proteção estendida para clientes SMTP no System.Net.Security namespace.
Proteção Estendida para Aplicativos Cliente
O suporte de proteção estendida para a maioria dos aplicativos cliente ocorre automaticamente. As classes HttpWebRequest e SmtpClient dão suporte à proteção estendida sempre que a versão subjacente do Windows oferece suporte à proteção estendida. Uma HttpWebRequest instância envia um SPN construído a partir do Uri. Por padrão, uma SmtpClient instância envia um SPN construído a partir do nome do host do servidor de email SMTP.
Para autenticação personalizada, os aplicativos cliente podem usar os métodos HttpWebRequest.EndGetRequestStream(IAsyncResult, TransportContext) ou HttpWebRequest.GetRequestStream(TransportContext) na classe HttpWebRequest que permitem recuperar o TransportContext e o CBT usando o método GetChannelBinding.
O SPN a ser usado para autenticação integrada do Windows, enviado por uma instância HttpWebRequest a um determinado serviço, pode ser substituído ao configurar a propriedade CustomTargetNameDictionary.
A TargetName propriedade pode ser usada para definir um SPN personalizado a ser usado para autenticação integrada do Windows para a conexão SMTP.
Proteção Estendida para Aplicativos de Servidor
HttpListener fornece automaticamente mecanismos para validar associações de serviço ao executar a autenticação HTTP.
O cenário mais seguro é habilitar a proteção estendida para HTTPS:// prefixos. Nesse caso, defina HttpListener.ExtendedProtectionPolicy como um ExtendedProtectionPolicy com PolicyEnforcement definido como WhenSupported ou Always, e ProtectionScenario definido como TransportSelected. Um valor de WhenSupported coloca HttpListener no modo parcialmente endurecido, enquanto Always corresponde ao modo totalmente endurecido.
Nessa configuração, quando uma solicitação é feita ao servidor por meio de um canal seguro externo, o canal externo é consultado para uma associação de canal. A associação de canal é passada para chamadas SSPI de autenticação, que validam que a associação de canal no blob de autenticação é correspondente. Há três resultados possíveis:
O sistema operacional subjacente do servidor não dá suporte à proteção estendida. A solicitação não será exposta ao aplicativo e uma resposta não autorizada (401) será retornada ao cliente. Uma mensagem será registrada na fonte de HttpListener rastreamento especificando o motivo da falha.
A chamada SSPI falha indicando que o cliente especificou uma associação de canal que não correspondeu ao valor esperado recuperado do canal externo ou o cliente não forneceu uma associação de canal quando a política de proteção estendida no servidor foi configurada para Always. Em ambos os casos, a solicitação não será exposta ao aplicativo e uma resposta não autorizada (401) será retornada ao cliente. Uma mensagem será registrada na fonte de HttpListener rastreamento especificando o motivo da falha.
O cliente especifica a associação de canal correta ou tem permissão para se conectar sem especificar uma associação de canal, pois a política de proteção estendida no servidor está configurada com WhenSupported a solicitação retornada ao aplicativo para processamento. Nenhuma verificação de nome de serviço é executada automaticamente. Um aplicativo pode optar por executar sua própria validação de nome de serviço usando a ServiceName propriedade, mas nessas circunstâncias ele é redundante.
Se um aplicativo fizer suas próprias chamadas SSPI para executar a autenticação com base em blobs passados para frente e para trás dentro do corpo de uma solicitação HTTP e quiser dar suporte à associação de canal, ele precisará recuperar a associação de canal esperada do canal seguro externo usando HttpListener para passá-la para a função Nativa Win32 AcceptSecurityContext . Para fazer isso, use a propriedade TransportContext e chame o método GetChannelBinding para recuperar o CBT. Há suporte apenas para associações de ponto de extremidade. Se qualquer coisa diferente de Endpoint for especificada, uma NotSupportedException será gerada. Se o sistema operacional subjacente dá suporte à associação de canal, o método GetChannelBinding retornará um ChannelBindingSafeHandle encapsulando um ponteiro para uma associação de canal adequada para ser passada para a função AcceptSecurityContext como o membro pvBuffer de uma estrutura SecBuffer passada no parâmetro pInput. A Size propriedade contém o comprimento, em bytes, da associação de canal. Se o sistema operacional subjacente não der suporte a associações de canal, a função retornará null.
Outro cenário possível é habilitar a proteção estendida para HTTP:// prefixos quando proxies não são usados. Nesse caso, defina HttpListener.ExtendedProtectionPolicy como um ExtendedProtectionPolicy com PolicyEnforcement definido como WhenSupported ou Always, e ProtectionScenario definido como TransportSelected. Um valor de WhenSupported coloca HttpListener no modo parcialmente endurecido, enquanto Always corresponde ao modo totalmente endurecido.
Uma lista padrão de nomes de serviço permitidos é criada com base nos prefixos que foram registrados com o HttpListener. Essa lista padrão pode ser examinada por meio da DefaultServiceNames propriedade. Se essa lista não for abrangente, um aplicativo poderá especificar uma coleção de nomes de serviço personalizado no construtor para a ExtendedProtectionPolicy classe que será usada em vez da lista de nomes de serviço padrão.
Nessa configuração, quando uma solicitação é feita ao servidor sem um canal seguro externo, a autenticação prossegue normalmente sem uma verificação de vinculação de canal. Se a autenticação for bem-sucedida, o contexto será consultado para o nome do serviço fornecido pelo cliente e validado na lista de nomes de serviço aceitáveis. Há quatro resultados possíveis:
O sistema operacional subjacente do servidor não dá suporte à proteção estendida. A solicitação não será exposta ao aplicativo e uma resposta não autorizada (401) será retornada ao cliente. Uma mensagem será registrada na fonte de HttpListener rastreamento especificando o motivo da falha.
O sistema operacional subjacente do cliente não dá suporte à proteção estendida. WhenSupported Na configuração, a tentativa de autenticação será bem-sucedida e a solicitação será retornada ao aplicativo. Always Na configuração, a tentativa de autenticação falhará. A solicitação não será exposta ao aplicativo e uma resposta não autorizada (401) será retornada ao cliente. Uma mensagem será registrada na fonte de HttpListener rastreamento especificando o motivo da falha.
O sistema operacional subjacente do cliente dá suporte à proteção estendida, mas o aplicativo não especificou uma associação de serviço. A solicitação não será exposta ao aplicativo e uma resposta não autorizada (401) será retornada ao cliente. Uma mensagem será registrada na fonte de HttpListener rastreamento especificando o motivo da falha.
O cliente especificou uma vinculação de serviço. A associação de serviço é comparada à lista de associações de serviço permitidas. Se corresponder, a solicitação será retornada ao aplicativo. Caso contrário, a solicitação não será exposta ao aplicativo e uma resposta não autorizada (401) será retornada automaticamente ao cliente. Uma mensagem será registrada na fonte de HttpListener rastreamento especificando o motivo da falha.
Se essa abordagem simples usando uma lista permitida de nomes de serviço aceitáveis for insuficiente, um aplicativo poderá fornecer sua própria validação de nome de serviço consultando a ServiceName propriedade. Nos casos 1 e 2 acima, a propriedade retornará null. No caso 3, ele retornará uma cadeia de caracteres vazia. No caso 4, o nome do serviço especificado pelo cliente será retornado.
Esses recursos de proteção estendida também podem ser usados por aplicativos de servidor para autenticação com outros tipos de solicitações e quando proxies confiáveis são usados.