Passando de cookie FormsAuthentication a um serviço WCF
-
23-08-2019 - |
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?
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.