CookieContainer et Authentification par formulaire dans un WebService Options
Bonjour,
J'ai créé un WebService sur lequel on peut s'authentifier en utilisant
le mode formulaire. J'ai développé deux applications clientes de ce
Webservice.
Une application ASP.NET et une application console.
Pour maintenir une session entre mon WebService et mon client, je dois
sauvegarder le cookie d'authentification (créé par mon WebService).
Je ne comprends pas comment implémenter ce mécanisme !
J'ai bien rajouté une instance de la classe CookieContainer à mon
Proxy:
MaClasseProxy myProxy = new MaClasseProxy ()
myProxy.CookieContainer=new CookieContainer();
Dois je ensuite mettre en session le cookie de d'authentification ? ou
le framework le fait déjà?
Les test que j'ai fait ne sont pas très concluant !
De plus je me demande si tous les clients (PHP, Java....) pourront
consommer ce service Web avec cette méthode d'authentification.
D'avance merci pour votre aide,
Hervé.
Conserver une Session Web en WinForm
Bonjour,
J'ai beaucoup cherché pour trouver une solution. Alors maintenant que ça fonctionne, je publie des infos sur la solution pour que les suivants ne galèrent pas trop !
Situation :
J'ai créé des services web. Ils sont consommés par une application web et par une autre application cliente en WinForm.
Tout fonctionne correctement avec l'application Web. En revanche, avec l'application WinForm, l'Id de Session était recréé à chaque appel d'un service de mon web service. Ce qui était genant pour suivre les clients connectés !
SOLUTION :
Première étape : Dans le service Web, il faut, pour chaque methode exposée, écrire :
[WebMethod(EnableSession = true)]
juste avant la méthode. Et je le répete : Pour chaque méthode exposée.
Nous disposons de Session.SessionID qui est l'id de session et qui pourra être passé au proxy.
Deuxième étape : Au niveau du client.
Il suffit d'instancier le web service et tout fonctionne... pour les clients web !
Pour que la session soit conservée pour les clients windows, il suffit, juste après l'instanciation du web service, d'instancier la classe CookieContainer :
monWebService.CokkieContainer = new System.Net.CookieContainer();
Voilà ! Donc, rvux69 avait tout bon. Je ne comprends pas ce qui n'allait pas pour lui... peut être juste le "(EnableSession = true)" qui manquait ?
Extrait de code :
Coté WebService
namespace monWebService
{
/// <summary>
/// Description résumée de Service1
/// </summary>
// [WebService(Namespace = "http://tempuri.org/")]
[WebService(Namespace = "http://action.mc")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// Pour autoriser l'appel de ce service Web depuis un script à l'aide d'ASP.NET AJAX, supprimez les marques de commentaire de la ligne suivante.
// [System.Web.Script.Services.ScriptService]
public class WebServ : System.Web.Services.WebService
{
// CldataWS est une classe d'acces à ma base de données
private monProxy.CldataWS Cx;
public WebServBill()
{
// Connexion à ma base de données
Cx = new monProxy.CldataWS();
}
[WebMethod(EnableSession = true)]
public String Connect()
{
// Cette méthode ne fait que passer l'Id de session à mon proxy (Cx)
// Ici, le seul point à noter est le passage de Session.SessionID
Cx.Connect(Session.SessionID.ToString());
return Session.SessionID.ToString()
}
}
}
Coté Client
namespace monClient
{
public partial class Base : Form
{
public WebServicesClient.WebServ WS;
// Constructeur de mon client
public Base()
{
// Instanciation du Web Service et de la session
WS = new WebServicesClient.WebServ();
// Instanciation de la classe CookieContainer
WS.CookieContainer = new System.Net.CookieContainer();
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
// Appel de la méthode Connect de mon WebServices
// Si tout est ok, le meme ID de session sera retourné à chaque
// appel tant que l'application n'est pas fermée.
String TestIdSession;
TestIdSession = WS.Connect();
}
}
}
Pour info, coté proxy
namespace monProxy
{
public class CldataWS
{
private System.IO.StreamReader SR;
private String ChaineConnexion;
private System.Data.SqlClient.SqlConnection CNX;
private System.Data.SqlClient.SqlCommand CMD;
private System.Data.SqlClient.SqlDataAdapter DA;
private System.Data.SqlClient.SqlDataReader DR;
private System.Data.DataSet DS;
private string Rq_Sql;
//Constructeur
// Cette méthode accede a la base de données
public CldataWS()
{
// Lecture de la chaine de connexion à la base de données
// La chaine de connexion est dans un fichier texte : connexion.txt
this.SR = new System.IO.StreamReader(@"C:\Philippe\SourcesCS\connexion.txt");
// Connexion à la base de données
this.ChaineConnexion = this.SR.ReadLine().ToString();
this.CNX = new System.Data.SqlClient.SqlConnection(ChaineConnexion);
// Fermeture du Stream Reader qui ne servait qu'a lire le fichier texte contenant la chaine de connexion à la base
this.SR.Close();
this.CMD = new System.Data.SqlClient.SqlCommand();
this.CMD.CommandType = System.Data.CommandType.Text;
this.CMD.Connection = this.CNX;
this.DA = new System.Data.SqlClient.SqlDataAdapter();
this.DA.SelectCommand = this.CMD;
this.DS = new System.Data.DataSet();
}
public int Connect(String _SessionId, String _Test)
{
int resultat = 0;
this.DS.Clear();
// Execution d'une procédure stockée qui va ajouter la session dans une table
this.Rq_Sql = "EXECUTE INSERT_SESSION '" + _SessionId +"''";
this.CMD.CommandText = this.Rq_Sql;
resultat = this.DA.Fill(this.DS);
return resultat;
}
}
}
N'hésitez pas à me contacter. Je n'ai pas une grande expérience, mais si je peux partager...
Philippe