Usuário com melhor resposta
Autenticação customizada utilizando NetTcpBinding e segurança no transporte

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.
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- Sugerido como Resposta AndreAlvesLimaModerator segunda-feira, 19 de julho de 2010 20:06
- Marcado como Resposta Flávio Borges - MCP - DotNet Framework terça-feira, 20 de julho de 2010 14:54
-
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- Marcado como Resposta Flávio Borges - MCP - DotNet Framework terça-feira, 20 de julho de 2010 14:54
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- Sugerido como Resposta AndreAlvesLimaModerator segunda-feira, 19 de julho de 2010 20:06
- Marcado como Resposta Flávio Borges - MCP - DotNet Framework terça-feira, 20 de julho de 2010 14:54
-
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. -
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 -
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.
MCP - TS: .Net Framework Application Development Foundation. Ciência da Computação - Unincor - Graduado!!! - Nós programamos o mundo. -
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 -
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. -
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- Marcado como Resposta Flávio Borges - MCP - DotNet Framework terça-feira, 20 de julho de 2010 14:54
-