Bonjour la communauté !
Je me tourne vers vous afin d'obtenir quelques réponses à mes questions...
Je développe actuellement un projet de "web services" s'appuyant sur la couche sécurité "WSE 3" de Microsoft. Après quelques petits problèmes d'utilisation de cette couche sous Visual Studio 2008 j'ai enfin un système qui fonctionne.
J'utilise le système de "token" par "username/password". J'ai surchargé la méthode "AuthenticateToken" afin de valider l'utilisateur dans une base de données "USER" définissant les comptes autorisés.
Dans mon application de test j'instancie le "web service" et appelle deux de ces méthodes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 protected override string AuthenticateToken(UsernameToken ctoken) { string password = null; DbConnection dbConnection; ConnectionStringsSection connectionStringsSection = ConfigurationManager.GetSection("connectionStrings") as ConnectionStringsSection; DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(connectionStringsSection.ConnectionStrings["SPM_CS"].ProviderName); dbConnection = dbProviderFactory.CreateConnection(); dbConnection.ConnectionString = connectionStringsSection.ConnectionStrings["SPM_CS"].ConnectionString; String query = "SELECT PASSWORD FROM USER1"; query += " WHERE LOGIN = @LOGIN AND PASSWORD = @PASSWORD"; using (dbConnection) { using (DbCommand oDbCommand = dbConnection.CreateCommand()) { oDbCommand.CommandText = query; oDbCommand.CommandType = CommandType.Text; DbParameter oDbParameter = dbProviderFactory.CreateParameter(); oDbParameter.ParameterName = "LOGIN"; oDbParameter.DbType = DbType.String; oDbParameter.Value = ctoken.Username; oDbCommand.Parameters.Add(oDbParameter); oDbParameter = dbProviderFactory.CreateParameter(); oDbParameter.ParameterName = "PASSWORD"; oDbParameter.DbType = DbType.String; oDbParameter.Value = ctoken.Password; oDbCommand.Parameters.Add(oDbParameter); dbConnection.Open(); DbDataReader dr = oDbCommand.ExecuteReader(); if (dr.HasRows) { dr.Read(); password = dr.GetString(dr.GetOrdinal("PASSWORD")); } } } return password;
Après avoir activé le traces sur mon serveur de base de données je me suis aperçu qu'à chaque appel d'une méthode du "web service" le mécanisme revérifie l'existance du compte dans la base de données (avec mon SELECT, ce qui semble assez pénalisant pour les performances). Est-ce normal ? Je m'attendais plutôt à un 1er accès à la base de données pour créer le "token" mais qu'ensuite il n'y en aurait plus sur l'appel des différentes méthodes.
N'y a t-il pas moyen de vérifier dans la base de données la validité du compte qu'une seule fois et ensuite utiliser le "token" créé et valide pour l'appel des différentes méthodes.
Y-aurait-il une autre méthode de WSE à surcharger pour effectuer cela (VerifyToken ?....) ? Un truc qui permettrait de vérifier si le "token" est valide et donc de ne pas à avoir à refaire un accès de vérification à la base de données ?
Je ne sais pas si j'ai été assez clair... Je l'espère en tout cas
Merci pour l'aide que vous pourrez m'apporter.
Pierrick
Partager