2009-07-07 9 views
9

J'ai un service web avec un tas de méthodes que j'aimerais sécuriser. Les données ne sont pas vraiment si confidentielles, mais je voudrais toujours limiter l'accès à ceux qui utilisent un certain ID utilisateur et mot de passe qui est stocké dans le fichier web.config services Web. Un client du service Windows C# appellera ce service Web une fois par jour ou par semaine.service web asmx: authentification client

Quelqu'un peut-il poster un exemple simple de comment je peux faire cela? Merci d'avance.

Répondre

3

Il existe trois approches générales pour la sécurité ad hoc SOAP:

  1. La première consiste à transmettre les informations d'authentification à chaque appel.
  2. La seconde consiste à le passer une fois pour recevoir un ID de session qui est ensuite transmis à chaque appel.
  3. Le troisième est essentiellement le même que le second, n'utilisant que des cookies.

Des trois, Je recommande la première méthode, qui ne nécessite pas le serveur pour maintenir l'état, mais peut être tout aussi rapide en raison de la mise en cache.

+0

Par ID de session, faites-vous référence à la sécurité basée sur les jetons? C'est ce que j'entends généralement appelé. En outre, cette "première méthode" peut être très différente et complètement inefficace en fonction de la manière dont elle l'a mise en place. C'est à dire. Authentification de base sans HTTPS qui n'a aucune valeur puisque le login et le mot de passe sont envoyés en texte brut. –

+0

Sorte de, bien qu'il puisse être aussi simple qu'un GUID. Ce qui compte, c'est que ce soit gros et effectivement aléatoire, donc on ne peut pas l'engager. Vous n'avez pas non plus besoin d'envoyer quoi que ce soit en texte brut.Par exemple, vous pouvez appeler GetChallenge pour recevoir un GUID, puis appeler LoginWithResponse, en passant ce GUID, avec le nom du compte cleartext et le hachage de la concaténation du GUID, du compte et du mot de passe. Ou, bien sûr, vous pouvez utiliser HTTPS, qui le résout d'une autre direction. –

9

Ceci est assez similaire à ma question: "What should we implement to authorize clients to use our web service?"

Nous avons fini par ne pas publier le WSDL et seulement au service le service via https et nécessitant basic authentication. N'utilisez PAS d'authentification de base si vous ne pouvez pas forcer tous les clients à utiliser https.

S'il s'agit d'un service Web .net, voici l'entrée du fichier de configuration pour empêcher la publication du fichier wsdl.

<system.web> 
    <webServices> 
     <protocols> 
     <remove name="Documentation" /> 
     </protocols> 
    </webServices> 
    </system.web> 

Lorsque vous goto la page, vous recevrez un message d'erreur semblable au message que vous obtiendriez si vous avez essayé de tirer manuellement vers le bas un web.config à partir d'un site. Comme Steven souligne, c'est la sécurité par l'obscurité et ne devrait pas être utilisé par lui-même pour sécuriser votre service Web. Cependant, lorsqu'il est utilisé en plus de auth + https de base, c'est un joli petit extra.

client Code Side:

Pour accéder à ce service Web à partir d'un client, ajoutez votre référence web de manière normale et dans le code d'appel (en supposant que votre référence Web est nommé WebRef).

WebRef.Url = "url"; 
WebRef.Credentials = new System.Net.NetworkCredential("userid", "password"); 

De même, vous pouvez chercher dans WebRef.PreAuthenticate pour économiser quelques allers-retours. Juste être prévenu que vous aurez un moment amusant de tester si vous êtes derrière un proxy d'entreprise. Les proxies sont utilisés via le WebRef par

WebRef.Proxy = new WebProxy("url"); 
WebRef.Proxy.Credentials = new System.Net.NetworkCredential("userid", "password"); 
+0

Il ne s'agit pas d'une étape supplémentaire déraisonnable, mais de la sécurité à travers l'obscurité, puisque rien sur https n'authentifie le client, donc tout s'effondre au moment de la découverte de l'URL du serveur (et ce sera le cas). Cela dit, exiger https et utiliser l'authentification de base est raisonnable. –

+2

Absolument, ne pas publier le WSDL est la sécurité par l'obscurité. Cependant, https + authentification de base + une certaine sécurité intégrée dans le code de service Web lui-même n'est pas la sécurité par l'obscurité. Si l'URL est découverte, ils n'auront pas le WSDL qui est ce qui était désiré. –

+0

Je n'ai pas accès au serveur sur lequel le service Web va résider, donc je ne suis pas sûr de pouvoir configurer un accès https uniquement. Y a-t-il une autre méthode que vous pouvez recommander? – zSynopsis

Questions connexes