Securiser un WebService Ajax
Lorsque l'on conçoit une application Web avec ASP.net, il nous arrive de plus en plus souvent de construire un WebService pour les besoins internes du site. Par exemple le contrôle AutoComplete des Ajax Toolkits nécessite la création d'un WebService qui prend en paramètre un début de mot et retourne une liste de suggestion. Cela pose quelques problèmes de sécurité car tout le monde peut facilement utiliser ce WebService. Il est donc nécessaire de le sécuriser un minimum.
Lorsque vous consommez un WebService en JavaScript avec Microsoft ASP.net Ajax Extensions, vous ajoutez une référence au niveau du ScriptManager ce qui entraine le rajout d'une référence vers un fichier JavaScript spécial : un proxy JavaScript. Ce proxy se trouve à l'adresse monWebService.asmx/js ou monWebService.asmx/jsdebug.
L'idée est de créer un HttpModule qui va autoriser ou bloquer l'appel vers le WebService. Vous pouvez le retrouver sur ASPFr.com ici : Module d'authentification pour les WebServices Ajax
Le principe est simple, tout d'abord je regarde si la requête porte sur un WebService en vérifiant l'extension de la ressource demandé (.asmx), puis je récupère le Type de la ressource grâce à la méthode BuildManager.GetCompiledType, je vérifie ensuite que le WebService est bien marqué de l'interface IWebServiceRequireAuthentication (de ma création). Je regarde ensuite si on demande le proxy JavaScript si c'est le cas je le conserve dans une variable Session, sinon je regarde l'état de la variable Session et lance une Exception si l'utilisateur n'a pas le droit d'exécuter cette WebMethod.
Pour l'utiliser il ne faudra pas oublier de rajouter l'HttpModule dans votre Web.Config, d'implémenter l'interface IWebServiceRequireAuthentication et enfin d'activer les Sessions au niveau de la WebMethod.
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class WebService : System.Web.Services.WebService, IWebServiceRequireAuthentication
{
[WebMethod(EnableSession=true)]
public string HelloWorld()
{
return "Hello World";
}
}
La source complete est disponible ici : Module d'authentification pour les WebServices AJAX