La sécurisation de service WCF à l'aide basicHttpBinding qui prend en charge la diffusion
Ma question est en ce qui concerne la meilleure (ou la moins douloureuse") de manière à sécuriser l'accès à un service WCF qui est seulement exposés à des internes de notre société utilisateurs. L'objectif est de s'assurer que le service est uniquement accessible via une simple application Windows forms que chacun de nos utilisateurs a installé. Quand le service est appelé, je veux que le service pour être en mesure de confirmer qu'il a été appelé à partir de la demande de permis.
Le service sécurisé utilise basicHttpBinding, qui prend en charge la diffusion, alors je crois que je suis limité pour le Transport au niveau de la sécurité.
Ci-dessous sont des versions simplifiées de la <bindings>
et <services>
sections de mon service du fichier de configuration.
<bindings>
<basicHttpBinding>
<binding name="Service1Binding" transferMode="Streamed"/>
</basicHttpBinding>
</bindings>
<services>
<service name="WCFServiceSecurity.Service1"
behaviorConfiguration="WCFServiceSecurity.Service1Behavior">
<endpoint address=""
binding="basicHttpBinding"
contract="WCFServiceSecurity.IService1"
bindingConfiguration="Service1Binding"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
Quelqu'un peut-il offrir quelques détails à savoir ce que j'aurais besoin de prendre pour mettre en œuvre la sécurité sur ce service?
Note: je suis nouveau sur WCF et je ne suis pas familier avec la sécurité à tous, alors laissez-moi savoir si je n'ai pas fourni suffisamment de détails.
Mise à JOUR:
Comme suggéré par marc_s, je voudrais réserver le service WCF en utilisant une sorte de nom d'utilisateur/mot de passe mécanisme. Cela donne un peu plus en direction d'une réponse, mais je suis toujours un peu floue sur comment de le faire réellement.
Parce que mon service nécessite de diffusion pour être activé, je dois utiliser basicHttpBinding et de sécurité au niveau Transport (à droite?); de plus, la méthode contenue dans mon service ne peut accepter un objet de Flux de données.
En tenant compte de ces contraintes en considération avec ma préférence pour l'utilisation de nom d'utilisateur/mot de passe de validation...
- Comment dois-je modifier mon service de fichier de configuration à force de nom d'utilisateur/mot de passe pour être livré?
- Comment mon service de valider les informations d'identification fournies?
- Comment mon application client de transmettre des informations d'identification du service lors d'un appel?
- Il nécessité à l'aide de SSL et, le cas échéant, toutes les machines clientes ont besoin d'un certificat?
Mise à JOUR:
Après avoir expliqué le problème que j'ai eu avec la sécurisation de ce service à mon patron, m'a donné le feu vert pour tenter l'Authentification Windows itinéraire. Malheureusement, je n'ai pas eu de chance dans la mise en œuvre de ce type d'authentification avec mon service de Streaming (argh). Après avoir fait les modifications appropriées (comme indiqué ici - la seule exception étant que mon transferMode="Streamed"
) et l'accès à mon service, j'ai été présenté avec l'erreur suivante:
Requête HTTP streaming ne peut pas être utilisé en conjonction avec l'authentification HTTP. Soit désactiver la demande de streaming ou de spécifier anonyme authentification HTTP.
Je suis tombé sur la citation suivante ici qui offre quelques précisions:
Vous ne pouvez pas faire de transport auth. avec le streaming. Si vous devez utiliser de la requête HTTP en streaming, vous devrez exécuter sans sécurité.
La voie de la sécurité fonctionne est:
WCF Client fait une requête http vers le Serveur.
Le Serveur répond avec quelque chose en disant: "Vous n'êtes pas autorisé, envoyez-moi un basic/digest/etc justificatif d'identité."
Le Client obtient la réponse et renvoie le message avec les informations d'identification cloué sur.
Maintenant que le Serveur reçoit le message, vérifie les informations d'identification, et continue.
Demande de diffusion n'est pas conçu pour fonctionner avec ce motif de sécurité. Si elle le faisait, il serait vraiment très lent, puisque le Client doit envoyer l'ensemble des flux, de passer le message à partir du Serveur qu'il n'était pas autorisé, alors il faudrait renvoyer la totalité du flux des informations d'identification.
Alors maintenant, je suis à la recherche d'avis, de comment feriez-vous pour sécuriser vos compatibles pour la diffusion de service WCF? Comme mentionné précédemment, une sorte de nom d'utilisateur/mot de passe mécanisme serait préférable. Pensez à l'extérieur de la boîte sur celui-ci...
Toute aide est la grandement apprécié!
OriginalL'auteur Steve Dignan | 2009-05-10
Vous devez vous connecter pour publier un commentaire.
Bien, j'ai trouvé beaucoup de questions autour de la sécurité/en streaming tout en travaillant sur ce problème. Le hack (euh...euh...solution de contournement) j'ai enfin fini avec a été de créer un nouveau DataContract qui hérite MemoryStream et décoré avec un BaseStream de la propriété (pour tenir les données que je veux en continu) ainsi que des propriétés utilisées pour l'authentification simple.
Ici est celle du DataContract:
Ci-dessus DataContract finit par être le paramètre d'entrée de mon service méthode. La première action de mon service consiste à authentifier les informations d'identification fournies par contre connu des valeurs valides et de continuer d'être approprié.
Maintenant, je ne savoir que c'est pas l'option la plus sûre, mais mon directive était d'éviter à l'aide de SSL (dont je ne suis même pas sûr, c'est possible de toute façon - comme indiqué ici) pour ce processus interne.
Cela dit, c'était la meilleure solution au problème énoncé ci-dessus que je pouvais venir, espérons que cela aide quelqu'un d'autre frappé avec ce problème.
Merci à tous ceux qui ont répondu.
OriginalL'auteur Steve Dignan
Il y a un certain nombre de choses que vous pourriez faire:
EDIT 2: OK, donc le nom d'utilisateur/mot de passe de l'approche semble sortir de la main.... que faire si vous avez juste de base de la sécurité des transports (SSL) pour une protection de base, et ensuite utiliser le
MessageContract
pour définir l'en-tête et le corps de votre message SOAP, inclure une valeur spécifique dans l'en-tête, et puis il suffit de vérifier que la présence de l'élément dans l'en-tête dans votre service?Quelque chose comme ça:
Et ensuite sur votre serveur dans votre code, il suffit de vérifier la présence et la validité de cette
AppThumbprint
code:Qui pourrait être beaucoup plus facile que le nom d'utilisateur/mot de passe de sécurité scénario.
Marc
Après j'ai modifier mon service de configuration comme ci-dessus et exécuter le service, je reçois l'erreur "BasicHttp liaison nécessite que BasicHttpBinding.De sécurité.Message.ClientCredentialType être l'équivalent de la BasicHttpMessageCredentialType.Certificat de type d'informations d'identification pour sécuriser les messages. Sélectionnez Transport ou TransportWithMessageCredential de sécurité pour le nom d'utilisateur des informations d'identification.". J'ai pensé à une streaming-permis d'extrémité de Transport requis au niveau de la sécurité? Aussi, dans le <endpoint> tag, je pense que la liaison de la valeur basicHttpBinding au lieu de basicHttpConfiguration.
Merci à tous pour votre aide Marc, mais malheureusement, je ne pense pas que cette approche (EDIT 2) va travailler pour mon scénario spécifique. Le service appel d'une méthode doit accepter et de retour d'un Flux. Votre réponse soulève une idée intéressante; je suppose que j'ai pu hériter d'un Ruisseau et de la décorer avec quelques onu/pw propriétés; ce Flux pourrait être le paramètre d'entrée de ma méthode de service (pas trop sûr, vous l'esprit). Mais au vu de l'apparente flexibilité de la WCF, j'ai supposons qu'il existe une meilleure façon... hmmmm.
OriginalL'auteur marc_s
S'il vous plaît corrigez-moi si je me trompe, mais:
si vous utilisez l'authentification par formulaire pour votre service WCf (sur asp.net), il suffit d'ajouter une méthode de connexion à votre service, en vous créer le cookie (formsAuthentication.Authenticate()). qui est automatiquement envoyé avec la réponse, le client peut appeler le flux API sans avoir besoin de paramètres supplémentaires (une des exigences pour être STREAM) ou vous pouvez vérifier l'identité de l'api en continu avant de déclencher le retour de flux.
Que pour la sécurisation de l'accès à l'ensemble de la WCF, j'ai le sentiment que l'incorporation d'un certificat dans le .net application est une façon d'aller. ils auraient à ildump de votre application pour obtenir à elle.
vous pouvez dire asp.net/wcf de ne pas fournir le wsdl, ou, plus exactement, de ne pas générer automatiquement le fichier wsdl. Sans accès wsdl, il devient beaucoup plus difficile pour eux de générer un proxy....
OriginalL'auteur Chris Turner
Si vous souhaitez utiliser
basicHttpBinding
(pour l'interopérabilité), vous ne pouvez transmettre vos informations d'identification au niveau du message. Vous devez définir votre configuration de sécuritéTransportWithMessageCredential
.Pour ce faire, vous devez créer un canal SSL, si vous avez besoin d'un certificat côté serveur, et il n'est pas nécessaire pour une cliente.
OriginalL'auteur Fernando
Il est possible d'utiliser l'authentification Windows avec le Streaming et le SSL, mais vous devez utiliser
TransportWithMessageCredential
:Vous devez définir dans le code
proxy.ClientCredentials.UserName.UserName
etproxy.ClientCredentials.UserName.Password
.OriginalL'auteur zarej
Si cela va être une application qui vit sur l'intranet, il peut être plus facile de simplement créer un nouveau groupe dans Active Directory et de donner seulement les membres de ce groupe, la capacité à utiliser le service.
Vous pouvez ajouter l'Authentification à l'aide d'informations d'identification windows) avec quelque chose comme ceci:
Pourrait Autoriser par la décoration de l'Interface à votre services méthodes:
Heres un bon lien à la Sécurité dans la WCF. Il y a beaucoup de Façon De s à la fin (l'un intitulé "Comment Utiliser basicHttpBinding avec l'Authentification Windows et TransportCreditals" pourrait être utiliser pour vous).
Wcf Secruity
[Disclaimer: je suis également nouveau sur WCF et n'ai pas fait exactement le cas auparavant, afin de s'en excuser si c'est un peu hors!]
OriginalL'auteur Cwoo