Pois é...na semana passada tive e fazer alguma investigação sobre WSE e de facto pode-se afirmar que o WSE é ... quase perfeito. digo quase, porque a minha primeira missão da semana passada residiu na construção de uma especificação para a construção de um conjunto de WebServices que são comuns a várias aplicações (algumas já existem e irão ser re-desenhadas; e ainda tinha de contemplar a construção aplicações futuras).
Como é óbvio, o primeiro requisito teria que ser a autenticação dos utilizadores. O WSE assentou que nem uma luva! O segundo requisito estava relacionado com o facto de ser necessário restringir o acesso a cada método dos vários Web Services...a primeira solução estaria relacionada com grupos; contudo isto iria implicar que, para cada método ou grupo de métodos fosse criado um grupo, algo que, como é possível aferir não é nada funcional! Bem, devo dizer que a utilização de roles, de ficheiros de serialização e do mecanismo de serialização do .net (XmlSerializer) funcionou muito melhor do que eu esperava!!!
Finalmente, apareceu o problema principal: partilhar os Web Services por várias aplicações. Isto é que veio baralhar as contas...pois é...neste contexto, um utilizador com direitos de administração na aplicação X pode ser apenas um utilizador "simples" na aplicação Y ( estou a supor que ambas as aplicações utilizam os mesmos Web Services)...
Aqui é que o WSE não solucionou o problema de forma perfeita...A solução (teórica) até era simples e parecia extremamente eficaz. A ideia era customizar o usernametoken, extendendo-o com duas novas propriedades que indicavam o domínio e o nome da aplicação. No servidor teria apenas de garantir a existência de um ficheiro com o nome nome_aplicação.xml que continha as permissões (digo roles) correctos para essa aplicação.
Mais algum tempo de investigação e voilá! A solução estava encontrada (ou pelo menos assim pensei eu). Resumindo, criei o meu usernametoken (que deriva do usernametoken orignal) e construí um usernametokenmanager que é responsável por efectuar a autenticação e inicializar o Principal com os roles correctos. Eureka!!! tinha descoberto a pólvora...contudo, este momento único de felicidade não durou muito...tudo funcionava às mil maravilhas...a minha aplicação só aceitava tokens do "meu" tipo e tudo parecia correr sobre rodas...até que, num teste, esqueci-me de enviar um token na minha mensagem...
Pois é, o usernametokenmanger (classe que é responsável por autenticar um usernametoken) só entra em acção quando é enviado pelo menos um security token. se não for enviado nenhum, então o método no meu Web Service era evocado normalmente (ou seja, nem havia autenticação do utilizador).
Após ler alguns artigos do site http://msdn.microsoft.com/webservices/building/wse/default.aspx descobri que, utilizando políticas, podia obrigar que a mensagem enviada do cliente para o servidor contivesse um token. Assim sendo, meti mãos à obra e construí o meu ficheiro de políticas. Com um usernametoken "normal" tudo funciona às mil maravilhas...contudo, com o "meu" usernametoken (ou seja, com o usernametoken personalizado) obtinha sempre um erro que dizia que o token enviado não era válido...diabos!!!
Foi então que resolvi tentar investigar mais um pouco...para grande tristeza minha, a documentação que acompanha o WSE 2.0 preview é praticamente inexistente...contudo, com recurso à grande ferramenta Anakrino :) tentei perceber o "funcionamento da coisa". Ora bem, ao que parece, a classe usernametokenmanager contém mais um método importante que devolve elemento do tipo ISecurityTokenAssertion. Bem, pensei que a chave para a resolução do problema estave aqui. Ccontruí então uma classe que implementava este interface...para grande surpresa minha, o método era chamado, só que depois nada...infelizmente tinha de entregar a especificação na sexta, pelo que a resolução para o problema passou pela construção de uma classe base que disponibiliza algums métodos úteis e que têm de obrigatoriamente ser evocados pelos métodos "reais" dos web services para fazerem a validação do contexto (verificarem se a mensagem tem ou não o token, etc, etc).
Como é óbvio, esta solução está longe de ser perfeita (isto porque todos os métodos têm de efectuar uma validação que em principio era desnecessária - ou melhor, a validação deveria era de ser feita pelo próprio WSE), mas tendo em atenção o tempo reduzido e a documentação (ou melhor a falta de dodumentação), foi o melhor que consegui arranjar...
se não perceberam nada do que eu escrevi, não se preocupem pois pretendo escrever um artigo muito mais descritivo :) ah, e já agora, se alguém tiver ideias, pistas...enfim, qualquer coisa sobre o assunto é só dizer!!!
posted on Tuesday, March 16, 2004 10:16 PM