none
Definindo o IPrincipal RRS feed

  • 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.

    segunda-feira, 19 de julho de 2010 12:04

Respostas

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
    segunda-feira, 19 de julho de 2010 14:16
    Moderador
  • 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.

    segunda-feira, 19 de julho de 2010 18:11
  • 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
    segunda-feira, 19 de julho de 2010 18:13
    Moderador