Quelle est la meilleure approche pour mettre en œuvre l'autorisation/authentification pour une application Windows Forms qui communique avec un service WCF RESTful hébergé par IIS ?
La raison pour laquelle je pose cette question est que je suis très confus, après avoir parcouru différents articles et posts exprimant une méthode différente et finalement être tombé sur un document de ~650 pages sur les "WCF Security Best Practices" (les meilleures pratiques en matière de sécurité WCF) ( http://www.codeplex.com/WCFSecurityGuide ) Je ne sais pas quelle est la MEILLEURE approche à adopter et comment commencer la mise en œuvre, compte tenu de mon scénario.
J'ai commencé par cet article "A Guide to Designing and Building RESTful Web Services with WCF 3.5" ( http://msdn.microsoft.com/en-us/library/dd203052.aspx ) et une vidéo du PDC sur les services WCF RESTful, qui était excellente et m'a aidé à mettre en œuvre mon premier service WCF REST-friendly,
Après avoir fait fonctionner le service, je suis revenu pour mettre en place la sécurité, voir. "Security Considerations" (au quart de la page) et j'ai essayé d'implémenter un en-tête HTTP Authorization selon les instructions, mais j'ai trouvé le code incomplet (voir comment la variable 'UserKeys' n'a jamais été déclarée). C'est à ce moment que j'ai essayé de faire des recherches plus approfondies sur la façon de procéder (en utilisant un hachage HMAC avec l'en-tête HTTP "Authorization", mais je n'ai pas trouvé grand chose sur google ?) cela m'a conduit à d'autres articles concernant la sécurité au niveau du message, l'authentification des formulaires et les validateurs personnalisés et franchement je ne suis pas sûr de savoir quelle est la meilleure approche et la plus appropriée à adopter maintenant.
Donc, tout ceci étant dit (et merci d'avoir écouté jusqu'à présent !), je pense que mes principales questions sont les suivantes,
**- Quelle implémentation de la sécurité dois-je utiliser ?
- Existe-t-il un moyen d'éviter d'envoyer le nom d'utilisateur/mot de passe à chaque appel WCF ? Je préférerais ne pas envoyer ces octets supplémentaires si une connexion a été établie au départ, ce qui sera le cas avant que les appels ultérieurs ne soient autorisés à être effectués après la connexion.
- Dois-je vraiment me préoccuper d'autre chose que du texte en clair si j'utilise SSL ?**
Comme indiqué, .NET 3.5 win forms app, service WCF hébergé par IIS, mais ce qui est important, c'est que je souhaite que tous les services WCF requièrent cette procédure d'autorisation (quelle qu'elle soit, session, en-tête http ou autre), car je ne veux pas que n'importe qui puisse accéder à ces services à partir du web.
Je sais que le message ci-dessus est volumineux mais je devais exprimer le chemin que j'ai déjà parcouru et ce que je dois accomplir, toute aide est grandement appréciée.
PS : J'ai également pris connaissance de ce post Comment configurer des services RESTful sécurisés avec WCF en utilisant nom d'utilisateur/mot de passe + SSL et si la communauté suggère que je m'éloigne de REST pour les services WCF, je peux le faire, mais j'ai commencé par cela pour garder la cohérence pour toutes les API publiques à venir.
Je pense qu'il est important d'indiquer comment j'accède à mon service WCF (le contact avec le service fonctionne, mais quelle est la meilleure façon de valider les informations d'identification - et de renvoyer ensuite l'objet Membre ?)
WebChannelFactory<IMemberService> cf = new WebChannelFactory<IMemberService>(
new Uri(Properties.Settings.Default.MemberServiceEndpoint));
IMemberService channel = cf.CreateChannel();
Member m = channel.GetMember("user", "pass");
Code à moitié implémenté à partir de l'article de MS (et un peu de mon propre code pour les tests) :
public Member GetMember(string username, string password)
{
if (string.IsNullOrEmpty(username))
throw new WebProtocolException(HttpStatusCode.BadRequest, "Username must be provided.", null);
if (string.IsNullOrEmpty(password))
throw new WebProtocolException(HttpStatusCode.BadRequest, "Password must be provided.", null);
if (!AuthenticateMember(username))
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
return null;
}
return new Member() { Username = "goneale" };
}