none
Autenticação customizada utilizando NetTcpBinding e segurança no transporte RRS feed

  • Pergunta

  • Olá pessoal, boa tarde.

    Estou com um problema aqui em relação a autenticação customizada... É o seguinte: preciso fazer uma autenticação baseada em informação contidas em um BD da aplicação. No entanto, devido a questões de desempenho, preciso utilizar netTcpBinding com segurança no transporte...

    Bom, pesquisei diversos artigos sobre autenticação customizada, dentre os quais este , mas não encontrei modos de realiza-lo utilizando netTcpBinding com securityMode="Transport", pois o mesmo não dá opção de autenticação via "UserName".

    Gostaria de saber se não é possível realizar a autenticação customizada utilizando netTcpBinding com segurança no transporte.

     

    Desde já agradeço a todos.

     

    Até mais.


    MCP - TS: .Net Framework Application Development Foundation. Ciência da Computação - Unincor - Graduado!!! - Nós programamos o mundo.
    segunda-feira, 19 de julho de 2010 17:58

Respostas

  • Boas Flavio,

    Nativamente você não tem esse suporte, mas penso que utilizar o ClearUserNameBinding do Yaron com alguma customização deverá funcionar: http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html
    http://www.israelaece.com
    segunda-feira, 19 de julho de 2010 18:11
    Moderador
  • Boas Flavio,

    Fiz um teste rápido aqui, sem muita atenção. Veja se resolve para você:

    public class ClearUsernameTcpBinding : CustomBinding
    {
        private MessageVersion messageVersion = MessageVersion.None;

        public void SetMessageVersion(MessageVersion value)
        {
            this.messageVersion = value;
        }

        public override BindingElementCollection CreateBindingElements()
        {
            var res = new BindingElementCollection();
            res.Add(new BinaryMessageEncodingBindingElement() { MessageVersion = this.messageVersion });
            res.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateUserNameOverTransportBindingElement(), true));
            res.Add(new AutoSecuredTcpTransportElement());
            return res;
        }

        public override string Scheme
        {
            get
            {
                return "net.tcp";
            }
        }
    }


    http://www.israelaece.com
    terça-feira, 20 de julho de 2010 13:51
    Moderador

Todas as Respostas

  • Boas Flavio,

    Nativamente você não tem esse suporte, mas penso que utilizar o ClearUserNameBinding do Yaron com alguma customização deverá funcionar: http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html
    http://www.israelaece.com
    segunda-feira, 19 de julho de 2010 18:11
    Moderador
  • Olá Israel,

    implementamos um teste utilizando o ClearUserNameBinding e o login funcionou.

    No entanto, eu gostaria de armazenar o usuário autenticado na sessão, para que eu não precisasse "autenticar" o usuário a todo momento e sim apenas se não existir um usuário logado na sessão... Como poderia fazer isso?

     

    Desde já, obrigado.

     

    Até mais.


    MCP - TS: .Net Framework Application Development Foundation. Ciência da Computação - Unincor - Graduado!!! - Nós programamos o mundo.
    segunda-feira, 19 de julho de 2010 20:53
  • Boas Flavio,

    E vocês customizaram o ClearUserNameBinding para suportar TCP? Pois, por padrão, ele é voltado para HTTP.

    Com relação ao reuso, não sei como se comporta no ClearUserNameBinding, mas acredito que ele não estabelecerá um contexto de segurança (SCT), para assim evitar a revalidação do usuário.
    http://www.israelaece.com
    terça-feira, 20 de julho de 2010 11:10
    Moderador
  • Olá Israel, bom dia.

    Desculpa não ter citado... Nós alteramos sim. Para funcionar, nós baseamos num post, localizado nos comentários do blog do Yaron, ou seja, alteramos o valor da propriedade Scheme , da classe ClearUserNameBinding para "net.tcp" e alteramos a herança da classe AutoSecuredHttpTransportElement  de HttpTransportBindingElement para TcpTransportBindingElement . Já no arquivo de configuração, alteramos o valor da propriedade messageVersion de "Soap12" para "Soap11WSAddressing10" .

     

    Agora, em relação ao reuso, complicou bastante... O sistema terá diversos usuários conectando a cada segundo para enviar pequenas quantidades de dados... Ou seja, fica bastante complicado ter que ficar autenticando o usuário a todo momento devido ao overhead que isso irá criar... Concluindo: precisamos muito disso.

     

    Até mais.
    MCP - TS: .Net Framework Application Development Foundation. Ciência da Computação - Unincor - Graduado!!! - Nós programamos o mundo.
    terça-feira, 20 de julho de 2010 11:50
  • Boas Flavio,

    Mas qual a periodicidade que um usuário ficará conectado?

    Dependendo da situação, não convém deixar ele conectado, pois haverá um grande overhead sendo mantido do lado do serviço para manter isso.
    http://www.israelaece.com
    terça-feira, 20 de julho de 2010 12:05
    Moderador
  • Olha cara,

    o sistema é dividido em vários módulos, mas um deles (o mais crítico em relação a esse problema) é uma espécie de monitoramento, onde o cliente deverá mandar informações digamos a cada segundo... Talvez menos... Dessa forma, imagino que o interessante seria manter esses clientes logados o tempo inteiro.

     

    Até mais.


    MCP - TS: .Net Framework Application Development Foundation. Ciência da Computação - Unincor - Graduado!!! - Nós programamos o mundo.
    terça-feira, 20 de julho de 2010 12:15
  • Boas Flavio,

    Fiz um teste rápido aqui, sem muita atenção. Veja se resolve para você:

    public class ClearUsernameTcpBinding : CustomBinding
    {
        private MessageVersion messageVersion = MessageVersion.None;

        public void SetMessageVersion(MessageVersion value)
        {
            this.messageVersion = value;
        }

        public override BindingElementCollection CreateBindingElements()
        {
            var res = new BindingElementCollection();
            res.Add(new BinaryMessageEncodingBindingElement() { MessageVersion = this.messageVersion });
            res.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateUserNameOverTransportBindingElement(), true));
            res.Add(new AutoSecuredTcpTransportElement());
            return res;
        }

        public override string Scheme
        {
            get
            {
                return "net.tcp";
            }
        }
    }


    http://www.israelaece.com
    terça-feira, 20 de julho de 2010 13:51
    Moderador
  • Ótimas Israel!!!

    Funcionou cara. Valeu mesmo pela ajuda!!!!

     

    Até mais.


    MCP - TS: .Net Framework Application Development Foundation. Ciência da Computação - Unincor - Graduado!!! - Nós programamos o mundo.
    terça-feira, 20 de julho de 2010 14:54