Sécurité de service web
Le
Fred
Bonjour,
Je souhaite sécuriser un service web. Je me perds un peu dans les méandres
de la documentation.
Pouvez-vous m'indiquer une piste pour mes recherches.
Sachant que :
Le client de mon service est une application WinForm, exécutée sur des
postes n'appartenant pas au domaine.
Je ne veux pas utiliser SSL pour ne pas surcharger le serveur. Les données
pouvant circuler en clair sur internet sans problème, à l'exception des
données d'identification de l'utilisateur (compte et mot de passe).
D'après ce que j'ai compris, il ne m'est pas possible d'utiliser
l'authentification Forms ? Et quand bien même, il me faudrait trouver un
moyen de passer outre la page de login (déjà en place pour d'autres
Applications Web sur le même serveur) car j'accède au service par
application WinForm.
La solution est-elle dans la personnalisation des en-têtes SOAP ?
Comment dans ce cas encrypter mes données ?
Pour mes applications Web, le serveur génère un ticket crypté en fonction
des informations d'identification envoyées en https.Ticket ensuite reconnu
par toutes les applications web du même serveur. Puis-je envisager le même
fonctionnement pour un web service : envoyer les credentials en SSL sur un
web service dédié à l'authentification et échanger ensuite un ticket crypté
par l'intermédiaire de l'en-tête SOAP ?
Merci de bien vouloir me mettre sur la bonne voie !
Je souhaite sécuriser un service web. Je me perds un peu dans les méandres
de la documentation.
Pouvez-vous m'indiquer une piste pour mes recherches.
Sachant que :
Le client de mon service est une application WinForm, exécutée sur des
postes n'appartenant pas au domaine.
Je ne veux pas utiliser SSL pour ne pas surcharger le serveur. Les données
pouvant circuler en clair sur internet sans problème, à l'exception des
données d'identification de l'utilisateur (compte et mot de passe).
D'après ce que j'ai compris, il ne m'est pas possible d'utiliser
l'authentification Forms ? Et quand bien même, il me faudrait trouver un
moyen de passer outre la page de login (déjà en place pour d'autres
Applications Web sur le même serveur) car j'accède au service par
application WinForm.
La solution est-elle dans la personnalisation des en-têtes SOAP ?
Comment dans ce cas encrypter mes données ?
Pour mes applications Web, le serveur génère un ticket crypté en fonction
des informations d'identification envoyées en https.Ticket ensuite reconnu
par toutes les applications web du même serveur. Puis-je envisager le même
fonctionnement pour un web service : envoyer les credentials en SSL sur un
web service dédié à l'authentification et échanger ensuite un ticket crypté
par l'intermédiaire de l'en-tête SOAP ?
Merci de bien vouloir me mettre sur la bonne voie !

Poser une question


passer le login et le password avec le code suivant :
//Autentification Windows
ICredentials credentials = new NetworkCredential("Login", "Pwd");
monServiceWeb.Credentials = credentials;
Incovénient : il faut stocker chez le client le login et le mot de passe.
"Fred" news:
crypté
Effectivement cette solution m'assure que l'accès au service ne se fera que
par l'intermédiaire de l'application WinForm (tant que le compte utilisé
n'est pas connu !).
Cela répond en partie à mon besoin. Je n'ai pas été très explicite dans ma
comparaison avec l'authentification Forms que j'ai mise en place pour
d'autres applications. Mais une fonctionnalité qui me serait fort utile
serait d'avoir les notions d'utilisateurs et de roles (sans pour autant les
avoir dans Active Directory, ils sont stockés dans une base de données SQL).
"Frédéric LAMBOUR" de news:
Finalement j'ai trouvé une façon de procéder, sans doute pas très orthodoxe,
qu'en pensez-vous ?
Je crée un service web. J'autorise le http, désactivé par défaut comme me
l'a signalé Simon Mourier plus tôt.
Dans le service web, un fichier login.asmx et un autre fichier à protéger
(contenant effectivement les services)
dans le web.config :
- < authentication mode=None />
- un élément location qui me permet d'accorder l'accès aux utilisateurs
anonymes sur le fichier login.asmx
<authorization>
<allow users="?" />
</authorization>
</location>
- de manière générale je n'autorise aucun utilisateur excepté certains roles
<authorization>
<allow roles="role1, role2, role3" />
<deny users="*" />
</authorization>
Dans login.asmx, j'authentifie l'utilisateur à partir d'une base de données,
j'ajoute un cookie crypté à la réponse (avec un nom spécifique puisque je ne
suis pas en mode Forms)
Dans Global.asax, je récupère le cookie crypté et je crée un
GenericPrincipal avec les roles de l'utilisateur.
Dernière étape, dans IIS, j'impose le SSL sur mon fichier login.asmx.
Cela à l'air de bien fonctionner.
"Frédéric LAMBOUR" de news:
qu'il contient, etc...
Dans les histoires de sécurité, la question à se poser c'est toujours de
savoir quelle attaque ou quelle menace on cherche à éviter, quels risques on
court (risque = impact + probabilité). Une fois qu'on a évalué ou calculé
ça, on met les moyens correspondant en face. Si vous protégez des silos de
missiles ou une centrale nucléaire avec des cookies cryptés, c'est sans
doute trop faible par exemple. Mais par rapport à vos besoins fonctionnels,
c'est peut-être largement suffisant. Ce que je veux dire c'est que le niveau
de sécurité nécessaire n'est pas une question technique.
Simon.
"Fred"
Merci pour cette appréciation. Effectivement ce niveau de sécurité sera très
suffisant pour mon application. Mais je profite de ce développement pour
approfondir un peu ces questions et parcourir la section "Security" de la
MSDN Library. D'ailleurs je n'ai rien inventé, mais collecté et adapté des
exemples de code C#. Mon cookie contient donc, à priori, les bonne infos :
nom utilisateur, roles, date de création et d'expiration, mais pas de mot de
passe.
Puis-je utiliser l'en-tête SOAP, plutôt qu'un cookie HTTP¨pour stocker mon
ticket crypté ? (ce qui me permettrait, si j'ai bien compris, d'interdire de
nouveau HttpGet et HttpPost, comme par défaut)
"Simon Mourier [MS]" de news: uR4%