Pergunta

Tudo isso é pertencente a WebHttp vinculativo, hospedado em um host de serviço personalizado (IIS não é uma opção neste momento).

Eu tenho implementado um UserNamePasswordValidator personalizado e um IAuthorizationPolicy personalizado. Quando eu configurar o terminal de ligação a utilizar a autenticação básica, tudo funciona exatamente como eu gostaria (costume principais, funções personalizadas, etc ..).

Eu gostaria de adicionar a capacidade para o acesso HTTP anônima bem, e tenho minhas implementações personalizadas colocar o usuário anônimo em algumas funções padrão, etc .. (se nenhum cabeçalho de autenticação é enviada).

O que acontece agora é que usuários anônimos recebem um 401 antes de qualquer do meu código personalizado é atingido. Se eu desligar o HTTP autenticação básica exigência, em seguida, o cabeçalho Authenticate é ignorado por completo.

Como faço para configurar, ou injetar um Authenticate do cabeçalho , para fazer isso em ambos os sentidos (sem a criação de 2 terminais separados)?

Foi útil?

Solução

Em primeiro lugar, o serviço responde corretamente à chamada anônima, de acordo com a especificação .

Em segundo lugar, isso é impossível. Quando você é auto-hospedar seu serviço e você tem algum http vinculativo, WCF vai usar uma instância System.Net.HttpListener para ser capaz de responder às solicitações HTTP (criado em System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen). Este ouvinte tem um método chamado HandleAuthentication que é chamado caminho antes de qualquer do seu código personalizado é chamado. Ele é responsável por enviar de volta a resposta 401 com o desafio (WWW-Authenticate). Não há nada que você possa fazer sobre isso. Se houver, eu gostaria de saber.

Então, você é deixado com as seguintes opções:

  • dois pontos finais
  • configure seus clientes para saber as credenciais padrão
  • mudar seus clientes para que eles possam responder ao desafio

Outras dicas

Eu tenho pesquisa feita sobre isso no passado e descobriu que ele não é possível através de configuração a menos que você criar 2 terminais separados (o que não é o que você quiser). Ele simplesmente não é suportado fora da caixa por WCF.

No entanto, o WCF é extremamente personalizável e você poderia provavelmente fazer isso escrevendo um canal personalizado / ligação que vai fazer o que quiser. Eu recomendo que você dê uma olhada no RESTO Chess código-fonte . Deve você começar.

Sua melhor aposta é implementar uma funções padrão através de um provedor de papéis e permitir que os usuários anônimos se juntar automaticamente esse papel. Em seguida, através de programação, ou via injeção política (aspecto orientado) política, conjunto para que determinada acesso anônimo ser permitido através do papel particular.

Quanto a essa configuração através de configuração, se for possível, seria bastante difícil e espécie de "hacky".

Eu não penso assim ... Eu estava escrevendo o que você precisa para criar a endpoint separado quando eu decidi ler você pergunta novamente e notou a última declaração de sua pergunta. Portanto, a resposta seria não (que eu saiba)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top