Pergunta

Eu tenho um site que fala com um serviço web WCF remoto. Ambos usam o mesmo provedor FormsAuthentication personalizado. Eu gostaria de autenticar com o serviço WCF representando o usuário atualmente logado no site. Eu já fiz isso manualmente, usando credenciais do cliente UserName mas eu preciso saber a senha do usuário. Então, o que funciona tão peido é esta: um usuário autenticado faz um pedido, eu criar um cliente de serviço e definir suas credenciais:

serviceClient.ClientCredentials.UserName.UserName = username;
serviceClient.ClientCredentials.UserName.Password = password;

Mas o que eu realmente quero é passar o cookie FormsAuthentication diretamente, porque eu não quero para armazenar a senha do usuário.

Todas as idéias?

Foi útil?

Solução

Parece que você está procurando o Windows Communication Foundation Authentication Service .

EDIT:

Depois de reler a questão com mais cuidado (e depois do comentário de Ariel) Eu gostaria de retirar a sugestão acima. O Serviço de Autenticação do WCF não vai acrescentar muito a este cenário.

Eu não tenho feito isso entre WCF e ASP.NET, ASP.NET aplicativos no entanto eu tenho configurado para compartilhar formas usuários autenticados, talvez eu possa ajudar de alguma forma.

Para garantir que ambas as aplicações pode criptografar / descriptografar o cookie de autenticação de formulários da mesma maneira que você deve configurar o elemento <machineKey> para ambas as aplicações (em web.config ou Machine.config, dependendo se você quiser fazer isso no nível da máquina ou aplicação). Você deve olhar para os atributos validation, validationKey, decryption e decryptionKey.

Certifique-se de que os seus elementos <forms> em ambos os arquivos web.config são configurados de forma semelhante. Especificamente o name, path e domain atributos.

É provável que isto só se aplica aos cookies passados ??para / a partir de um navegador web (mas pode ser útil neste caso): Para permitir cookies para ser passada entre os sites www.foo.com e bar.foo.com você iria configurar o elemento forms da seguinte forma para permitir cookies para ser definido em um site e com sucesso passou para o outro:

<forms ... domain=".foo.com" ... />

Passando o cookie para o serviço WCF é provável que seja a pouco complicado. Eu não sou muito experiente com o WCF, então eu adaptei código de kennyw.com :

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>");

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel))
{
  OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
  serviceClient.MethodName();
} 

Se você está hospedando WCF no IIS (e não auto-hospedagem), você pode passar a solicitação WCF através do pipeline de processamento ASP.NET, definindo

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... />
</system.serviceModel>

Se você é auto de hospedagem que você pode examinar os cabeçalhos de solicitação usando propriedades da mensagem recebida em OperationContext.Current.IncomingMessageProperties e obter o valor do cookie de autenticação de formulários e decifrá-lo usando FormsAuthentication.Decrypt(string) .

Eu não tenho idéia se nada disso iria funcionar, mas gostaria de ouvir se isso acontecer!

Outras dicas

É o suficiente simples de fazer se você hospedar o serviço WCF dentro do site IIS autenticado.

Ativar compatibilidade adicionando o seguinte para sua seção system.serviceModel em seu web.config

<system.serviceModel>  
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel>

Em seguida, decorar cada serviço que deseja aceitar o cookie com a seguinte

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Agora o objeto HttpContext.Current.User.Identity será preenchido corretamente e você também pode usar PrinciplePermission pede para limitar o acesso por papel ou para usuários específicos.

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