Nome de usuário do WCF sem certificado

Estou trabalhando em um projeto em que preciso do seguinte.

Serviço WCF no lado do servidor (.NET 3.5)Cliente WPF para o lado do cliente (.NET 3.0)

Eu tenho um aplicativo existente do qual tenho que usar a autenticação e autorização (no lado do servidor). Também preciso armazenar alguns metadados sobre o usuário no Principal de thread do serviço WCF (um objeto de site). Faço isso para que eu possa acessá-lo no serviço WCF, se for absolutamente necessário; alguma lógica de negócios pode exigir isso. Então, meu plano era fazer o seguinte ...

Crie um ServiceAuthorizationManager personalizado para o servidor e, nesse caso, efetuarei login no usuário e obterá as funções do aplicativo existente. Colocarei em cache o objeto "Site" e, após solicitações adicionais, extraímos do cache. Também precisarei de um objeto CustomPrincipal para armazenar meus dados personalizados. Eu quero representar o usuário para que eu possa usar as funções internas que filtram no WCF assim:

[PrincipalPermission(SecurityAction.Demand, Role = "Role1")]
public string[] RolesForUser(string username){}

Tentei usar a autorização do ASP.NET com um provedor de funções personalizadas, mas não consegui definir nada no Principal Atual. Também tentei usar um IAuthorizationPolicy personalizado, mas surgiram problemas. Esses problemas tratavam de poder usar o aplicativo WCFClient.exe, quando descobria (usando a terminação mex) não daria credenciais, portanto o logon falharia. Acabei decidindo que um ServiceAuthorizationManager era o caminho certo a seguir, mas estou aberto a outras sugestões.

No cliente, reunirei as credenciais e as colocarei na classe de proxy do WCF, da seguinte maneira.

proxy.ChannelFactory.Credentials.UserName.UserName = userName;
proxy.ChannelFactory.Credentials.UserName.Password = password;

Quando comecei a seguir esse caminho, notei que não era possível obter o nome de usuário / senha no método CheckAccessCore da minha classe de gerente. Uma investigação mais aprofundada mostrou que eu realmente deveria estar autenticando em um UserNamePasswordValidator personalizado. Então eu criei um desses. O problema é que o método validate nunca foi chamado.

Investigações posteriores mostraram que, para que o método validate seja chamado, meu serviço WCF precisa ter segurança no nível de mensagem ou transporte. O problema é que não consigo descobrir como ter uma mensagem ou segurança no nível de transporte sem umX.509 certificado. Este produto está entrando em várias centenas de máquinas incrivelmente bloqueadas e a instalação de um certificado não é possível.

Existe uma maneira de fazer o que estou pedindo sem instalar um certificado?

questionAnswers(3)

yourAnswerToTheQuestion