Usuário com melhor resposta
Definindo o IPrincipal

Pergunta
-
Bom dia Israel,
Estou com um problema com Login no meu serviço WCF.
Ocorre o seguinte, criei um serviço só para autenticação, onde o cliente tem disponível em um serviço os métodos Login e Logout. Quando o cliente loga suas credencias é setadas no IPrincipal:
/// <summary>
/// Realiza login no Webservice.
/// </summary>
/// <param name="UserName">User Name.</param>
/// <param name="Password">Password.</param>
public static void Login(string UserName, string Password)
{
if (!(UserName == "P" && Password == "123"))
throw new SecurityAccessDeniedException("Invalid UserName and Password.");
//Seta as credenciais no IPrincipal.
}Até ai está tudo bem, o problema é quando o segundo cliente tentam logar no serviço, existe uma verificação se o cliente está logado:
/// <summary>
/// Verifica se o usuario está autenticado.
/// </summary>
public static bool IsAuthentication
{
get
{
if (Thread.CurrentPrincipal is MeuPrincipal)
return ((MeuPrincipal)Thread.CurrentPrincipal).Identity.IsAuthenticated;
return false;
}
}Ela sempre retorna true, mantendo as credenciais do primeiro cliente logado. Gostaria que quando o segundo cliente entra-se no serviço fosse criada uma nova sessão para ele, assim eu teria dois clientes logados ao mesmo tempo.
Cenário:
1 - O host está hospedado na minha maquina.
2 - O primeiro cliente a logar é uma outra maquina dentro de uma Lan.
3 - O segundo cliente que tenta logar sou eu.Espero que eu tenha sigo claro.
Se puder me ajudar, agradeço.
- Dividir Israel AeceModerator segunda-feira, 19 de julho de 2010 14:13 Não misturar.
Respostas
-
Boas Paulo,
Mas se quer evitar o uso de certificado para enviar login e senha para o serviço, então você pode utilizar o ClearUserNameBinding: http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html
http://www.israelaece.com- Marcado como Resposta Paulo Henrique Vieira segunda-feira, 19 de julho de 2010 19:12
- Não Marcado como Resposta Paulo Henrique Vieira segunda-feira, 19 de julho de 2010 19:13
- Marcado como Resposta Paulo Henrique Vieira segunda-feira, 19 de julho de 2010 19:13
Todas as Respostas
-
Boas Paulo,
O problema é que você está alterando o IPrincipal da thread que executa o seu serviço.
O correto é você plugar isso através de uma policy, como eu mostro aqui: http://www.israelaece.com/post/WCF-Seguranca-Autenticacao-e-Autorizacao-Customizadas.aspx
http://www.israelaece.com- Sugerido como Resposta AndreAlvesLimaModerator segunda-feira, 19 de julho de 2010 16:37
-
Obrigado pela resposta,
eu tentei utilizar o método que você está utilizando em seu artigo. Mas ainda não conseguei utilizar no meu contexto, o motivo é que quando chamo o método Login, do meu serviço ele já tenta buscar o IPrincipal, mas neste momento ele ainda não foi setado.
Talvez não ficou claro o que eu estou precisando, por isto vou detalhar melhor o que eu preciso.
1 - Quero passar as credenciais do cliente sempre precisar de um certificado, por isto criei um serviço exclusivo para autenticação.
Ex:[ServiceContract()]
interface IContrato
{
[OperationContract()]
void Login(string UserName, string Password);
}2 - Quando o cliente passar suas credenciais pelo serviço de autenticação, quero guardar-las em um contexto, pois quando ele tenhar acessar outro serviço verifico somente se ele está autenticado.
public class Service : IContrato2
{
#region IContrato2 Members
string IContrato.Msg()
{
Authentication.VerifyIfAuthentication();
return "Passou...";
}
#endregion
}Existe alguma maneira de fazer isto?
Obrigado.
-
Boas Paulo,
Mas se quer evitar o uso de certificado para enviar login e senha para o serviço, então você pode utilizar o ClearUserNameBinding: http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html
http://www.israelaece.com- Marcado como Resposta Paulo Henrique Vieira segunda-feira, 19 de julho de 2010 19:12
- Não Marcado como Resposta Paulo Henrique Vieira segunda-feira, 19 de julho de 2010 19:13
- Marcado como Resposta Paulo Henrique Vieira segunda-feira, 19 de julho de 2010 19:13