Microsoft ASP.net Ajax Extensions (CodeName Atlas) nous pousse de plus en plus à construire des WebServices pour des parties de notre application. Par exemple pour pouvoir utiliser le contrôle AutoComplete des toolkits il nous faut faire un WebService (.asmx) retournant une liste de suggestion en fonction d'un début de mot. Cela peut poser des problèmes de sécurité, car n'importe qui peut très facilement utiliser ce WebService.
Cet HttpModule résoud ce problème, en effet avant d'executer le WebService il vérifie si l'appel vient d'un utilisateur de notre site. Si le client demande le proxy JavaScript (monWebService.asmx/js), je l'enregistre dans une variable session. Lors d'un appel vers une méthode du WebService je vérifie si la variable Session est positionné avant de continuer. On peut également enregistrer l'utilisateur pour le WebService en utilisant la méthode static RegisterSessionForWebServiceCall de l'HttpModule. Puisque j'enregistre l'état au niveau de la session il ne faut pas oublier d'activer les session au niveau des méthodes du WebService.
Pour l'utiliser il faut d'abord enregistrer ce module dans le Web.config :
<httpModules>
<add name="WebServiceAuthenticationModule" type="Cyril.Web.HttpModules.WebServiceAuthenticati onModule"/>
</httpModules>
Puis implémenter l'interface IWebServiceRequireAuthentication sur le WebService, il s'agit juste d'une interface "marqueur" il n'y aucune méthode à implémenter, mais c'est à partir de cette interface que le module sait s'il doit vérifier la requete en cours ou non.
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(Conform sTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
publ ic class WebService : System.Web.Services.WebService, IWebServiceRequireAuthentication
{
[WebMethod(EnableSession=true)]
public string HelloWorld()
{
return "Hello World";
}
}