Déploiement d'un web service dans IIS 5 [Résolu]

DjAdes 38 Messages postés vendredi 31 mai 2002Date d'inscription 6 juillet 2011 Dernière intervention - 4 mai 2006 à 11:05 - Dernière réponse : DjAdes 38 Messages postés vendredi 31 mai 2002Date d'inscription 6 juillet 2011 Dernière intervention
- 1 mars 2007 à 19:44
Bonjour,
Voici ma situation : j'ai un web service qui permet de partager un répertoire. Tout d'abord, je l'ai développé avec Visual Studio 2005. Tout marchait à la perfection. Le problème est survenu lorsque j'ai essayé de publier mon web service sur le serveur web IIS 5. La publication se fait sans problèmes mais à l'appel de ma méthode qui partage le répertoire, celle-ci me lance une exception qui me dit que l'accès est refusé (je ne sais pas à quel resource l'accès est refusé...).

Tout d'abord, j'ai pensé aux ACL du répertoire. Afin d'y remédier, j'ai ajouté le groupe d'utilisateur Tout le monde avec un contrôle total sur mon répertoire. Mais rien n'y fait, l'exception persiste.
C'est pourquoi je me suis dit que le problème venait de IIS qui n'a peut-être pas les autorisations nécessaires pour effectuer certaines tâches (systèmes). Le problème est que je ne maîtrise pas bien IIS et que je ne vois pas bien où aller pour autoriser mon web service à partager un répertoire.

Que dois-je faire ?

Merci d'avance pour vos réponses,
Seb.

PS: Je pense que j'ai le même problème lorsque je veux spécifier un mot de passe pour un utilisateur Active Directory (méthode Invoke("SetPassword", new object[] { "pwd" });). Le message de l'exception est également : Accès refusé. Cela renforce mon idée du problème d'autorisation dans IIS. Ceci dans le même web service que spécifié plus haut.
Afficher la suite 

9 réponses

Répondre au sujet
DjAdes 38 Messages postés vendredi 31 mai 2002Date d'inscription 6 juillet 2011 Dernière intervention - 17 mai 2006 à 09:58
+3
Utile
J'ai enfin trouvé la solution. Elle concerne effectivement l'impersonation. Il fallait la mettre dans le code vu que dans le fichier de config ou dans la console IIS ca ne fonctionnait pas.
Si quelqu'un est intéressé, je veux bien mettre les lignes de codes qui permettent d'effectuer une impersonation.

Petit détail, l'impersonation telle que je l'ai faite ne fonctionne qu'avec Windows Server 2003. Je veux dire par là que j'ai essayé sur un Windows 2000 Server ca ne donne rien. La sécurité a dû être revue dans la nouvelle version. Par contre je ne sais pas si c'est IIS 6 ou Windows Server 2003 qui fait fonctionner le tout.

Pour ce qui est de la fonction "SetPassword" du client ldap, l'impersonation ne change rien, je ne peux toujours pas appeller cette fonction (Access Denied). A défaut de cette fonction, j'utilise "ChangePassword" qui demande des droits moins pointus.

Je n'ai toujours pas d'utilisateur ASPNET. Je pense que cet utilisateur est ajouté automatiquement avec Visual Studio (plus précisément, avec le serveur de développement) mais, dans mon cas, Visual Studio n'est pas installé sur le serveur web. Je n'ai donc que les deux utilisateur cités ci-dessus.

Merci de votre aide,
Seb.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de DjAdes
zebobo5 273 Messages postés dimanche 5 octobre 2003Date d'inscription 6 février 2009 Dernière intervention - 5 mai 2006 à 14:19
0
Utile
Salut,

Ton webservice n'a pas les droits nécéssaires donc :

Vas dans l'administration IIS, sur les propriétés ASP.Net,"Edit configuration", de ton répertoire qui contient ton webservice,
là tu as un onglet "Application", avec une propriété "Role impersonation" où tu lui donne le nom et mot de passe d'un utilisateur ayant les droit que doit utiliser ton webservice.

<hr>ZeBobo5
N'oubliez pas de cloturer votre post.
Commenter la réponse de zebobo5
DjAdes 38 Messages postés vendredi 31 mai 2002Date d'inscription 6 juillet 2011 Dernière intervention - 5 mai 2006 à 16:58
0
Utile
Merci pour ta réponse,
J'essairai cela lundi car je n'ai pas accès au serveur le week-end.

Seb.
Commenter la réponse de DjAdes
DjAdes 38 Messages postés vendredi 31 mai 2002Date d'inscription 6 juillet 2011 Dernière intervention - 8 mai 2006 à 11:36
0
Utile
Malheureusement, l'impersonation ne fonctionne pas. Je l'avais déjà essayée en tapant la ligne dans mon fichier web.config mais sans résultat. J'ai également essayé, comme tu me l'as conseillé, de le faire via la console IIS mais le même phénomène se produit : la connexion est interrompue (= message de l'exception).

Seb.
Commenter la réponse de DjAdes
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 13 mai 2006 à 00:22
0
Utile
Est-ce que l'utilisateur ASPNET à les droits ?

::|The S@ib|:: MVP C#.NET
Commenter la réponse de TheSaib
DjAdes 38 Messages postés vendredi 31 mai 2002Date d'inscription 6 juillet 2011 Dernière intervention - 13 mai 2006 à 08:02
0
Utile
Je n'ai pas d'utilisateur ASPNET. Les utilisateurs IIS sont IUSR_NomMachine et IWAM_NomMachine. J'ai déjà affecté tous les droits possibles à ces deux comptes mais rien ne change. Je les ai même fait agir en tant que système d'exploitation. Rien ne semble fonctionner.

Seb.
Commenter la réponse de DjAdes
tanginthemiddle 5 Messages postés mardi 16 mai 2006Date d'inscription 26 juin 2006 Dernière intervention - 17 mai 2006 à 09:33
0
Utile
Il faut permettre à ASP.net d’emprunter une identité Windows (IUSR_machine et IWAM_machine). Dans le WebConfig, ajoute la ligne

<
identity


impersonate
=
"True"/>
Commenter la réponse de tanginthemiddle
phoenix_67 1 Messages postés jeudi 19 mai 2005Date d'inscription 19 février 2007 Dernière intervention - 19 févr. 2007 à 13:21
0
Utile
Bonjour,
J'ai exactement le même problème que toi, j'ai un service web qui accède au réseau pour lister le contenu d'un répertoire.
En utilisant le mode déboguage de visual studio 2005 mon application fonctionne parfaitement, mais en utilisant le serveur iis5 je n'arrive pas à faire fonctionner mon application (en ajoutant au fichier de configuration web.config, mon application ne fonctionne pas; en faisant un Impersonate dans le code mon application ne fonctionne pas mieux).
J'aurais voulu savoir :
1) si vous êtes arriver à faire fonctionner votre service web sur iis5.
2) avez-vous modifier quelque chose (code, parametres) pour que votre service web fonctionne sur iis6?
3) je serrais intéresser par les lignes de code que vous avez utiliser pour  l'impersonation.
Merci de vos réponses.
Commenter la réponse de phoenix_67
DjAdes 38 Messages postés vendredi 31 mai 2002Date d'inscription 6 juillet 2011 Dernière intervention - 1 mars 2007 à 19:44
0
Utile
Avant toute chose, la programmation de cette application date de quelques temps. Je ne saurai donc pas assurer que ma réponse est totalement correcte!

1) Je ne pense pas être parvenu à faire fonctionner mes Web Services sur IIS 5.
2) Je ne me souviens pas avoir chnagé quelque chose en particulier pour faire fonctionner l'application sur IIS 6.
3) Voici la classe que j'ai écrite afin d'effectuer une impersonation :

using System;
using System.Data;
using System.Configuration;
using System.Runtime.InteropServices;

//using System.Web;
//using System.Web.Security;
//using System.Web.UI;
//using System.Web.UI.WebControls;
//using System.Web.UI.WebControls.WebParts;
//using System.Web.UI.HtmlControls;

/// <summary>
/// Classe permettant d'effectuer simplement une impersonation
/// </summary>
public class Impersonation
{
[DllImport("Advapi32.dll")]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
Int32 dwLogonType,
Int32 dwLogonProvider,
out Int32 phToken
);

[DllImport("Advapi32.dll")]
private static extern int ImpersonateLoggedOnUser(
Int32 Token);

[DllImport("Advapi32.dll")]
private static extern int RevertToSelf();

/// <summary>
/// Active l'impersonation
/// </summary>
/// Nom de l'utilisateur auquel on va emprunter l'identité


/// Mot de passe de l'utilisateur


public static void activeImpers(string utilisateur, string pass)
{
// Try to impersonate
Int32 hToken;
bool log;

log = LogonUser(
utilisateur,
null,
pass,
2,
0,
out hToken
);

if (log == false)
{
int erreur = Marshal.GetLastWin32Error();
throw new Exception("Impossible de récupérer le jeton de l'utilisateur spécifié (code " + erreur + ")");
}

int Res;
Res = ImpersonateLoggedOnUser(hToken);

if (Res != 1)
{
throw new Exception("Impossible d'effectuer l'impersonation");
}
}

/// <summary>
/// Désactive une impersonation
/// </summary>
public static void desactiveImpers()
{
RevertToSelf();
}
}

J'espère avoir répondu assez clairement.

Seb.
Commenter la réponse de DjAdes

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.