Créer un mécanisme d'authentification sur un webservice asmx via les header SOAP
Par Thierry THOUA le dimanche, novembre 18 2007, 23:37 - ASP.NET - Lien permanent
Il est fréquent d'utiliser des webservices dans des architectures distribuées ... Mais qu'en est-il de la sécurité ? Tant que l'on utilise les authentifications Windows... tout est simple tout est beau ... En effet, il suffit d'utiliser les NetworkCredentials et quelques permissions sur les role au dessus des méthodes pour ajouter certaines sécurités ... Mais sur l'internet, ces regles ne sont parfois pas utilisées... En effet, on ne récupère pas toujours les informations sur un serveur AD. Ainsi ... je présente ici un tout petit exemple sur comment créer un simple mécanisme d'authentification sur un webservice ASP.NET 2.0.
Les "credentials" sont ajoutées dans le header de la requête WEB. Ainsi pour se faire, il faut construire une classe héritant de SoapHeader
public class UserCredentials : SoapHeader
{
public string UserName;
public string Password;
}
Il faut par après implémenter le webservice ;-). Pour les méthodes ou il faut ajouter les credentials, il faut spécifier un attribut [SoapHeader("CustomCredentials")].
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SecureWebService : WebService
{
public UserCredentials CustomCredentials
{
get { return m_userCredentials; }
set { m_userCredentials = value; }
}
public SecureWebService ()
{
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
[SoapHeader("CustomCredentials")]
public string HelloWorld()
{
if (null != CustomCredentials)
{
return "Hello World " + CustomCredentials.UserName;
}
return "Not logged";
}
[WebMethod]
public string HelloWorld2()
{
if (null != CustomCredentials)
{
return "Hello World " + CustomCredentials.UserName;
}
return "Not logged";
}
private UserCredentials m_userCredentials;
}
Il ne reste plus qu'a appeler ce webservice depuis du code client en spécifiant le login pass ... On voit ainsi que la méthode "HelloWorld" reçoit les credentials au contraire de "HelloWorld2"...
localhost.SecureWebService web = new ConsoleApplication1.localhost.SecureWebService (); web.UserCredentialsValue = new ConsoleApplication1.localhost.UserCredentials(); web.UserCredentialsValue.UserName = "Admin"; web.UserCredentialsValue.Password = "Admin"; string result = web.HelloWorld(); Console.Out.WriteLine(result); result = web.HelloWorld2(); Console.Out.WriteLine(result);

