2012-11-13 8 views
3

Dans l'application que je suis en train de développer, nous utilisons l'authentification par formulaires ASP.Net pour accorder à l'utilisateur un accès ultérieur au site. Ce site est destiné aux utilisateurs mobiles et, en tant que tel, nous essayons d'être aussi indépendants du serveur que possible et d'utiliser KnockoutJS pour appeler le service Web et charger les données afin que l'utilisateur puisse les voir.Transférer en toute sécurité UserID d'ASP.Net à Javascript

À l'heure actuelle, le service Web (service REST utilisant la méthode GET) requiert le nom d'utilisateur afin de charger les données spécifiques à cet utilisateur. J'ai cette information sur le côté serveur (ASP.net) et je peux facilement accéder à User.Identity.Name ou accéder au cookie d'authentification de formes directement et tirer l'information.

Mon problème est que je dois obtenir le nom d'utilisateur du serveur au client afin que l'appel de service puisse être fait. J'ai cherché à le faire en toute sécurité, mais jusqu'à présent, je me suis trompé. Actuellement, je passe le nom d'utilisateur en tant que paramètre url et l'analyse en utilisant JavaScript, avec une vérification sur la méthode Page_Load pour vérifier le nom d'utilisateur dans l'URL correspond à l'utilisateur connecté.

J'ai besoin d'un moyen de sécuriser passer un nom d'utilisateur à partir de ASP.Net qui a authentifié l'utilisateur en utilisant le formulaire pour le côté client JavaScript afin que je puisse faire un appel de service web REST.

EDIT: Donc, après googler et rencontre avec mon chef d'équipe, je pense nous allons utiliser une implémentation OAuth similaire à cet exemple:

http://www.c-sharpcorner.com/UploadFile/surya_bg2000/secure-wcf-restful-service-using-oauth/

Aussi pour quoi que ce soit à la recherche d'autre pour la même réponse que je a trouvé cette question très utile dans la compréhension OAuth:

What's the point of a timestamp in OAuth if a Nonce can only be used one time?

en supposant que tout est mise en œuvre édité correctement serait-il plus sécurisé (totalement sécurisé, sécurisé, ou plus dangereux?) pour passer la signature générée via une balise ASP comme mentionné ci-dessous?

EDIT 2: Après un peu plus d'examen et un peu plus de recherche, nous avons finalement décidé d'un cadre et d'une méthode pour faire ce travail. Il se trouve que OAuth est pas nécessairement la réponse ici, cette question:

But Seriously.... Example of ASP.NET WebAPI implementation including OAuth

était beaucoup d'aide et de trouver comment faire ce travail. Ce que nous allons finir par faire est de générer la signature et de mettre sur le javascript et faire l'appel comme ça. Les signatures vont être sensibles au temps et régénérées chaque fois que l'utilisateur charge la page de manière très OAuth mais nous ne sommes pas en train d'implémenter la spécification complète.

TL: DR solution finale était de générer une signature de hachage et de le mettre sur la page par tag serveur ASP <% aspvar_here%> et l'utiliser pour valider l'appel de service

+0

Le service est-il sur le même serveur/domaine que le site sur lequel votre utilisateur est connecté? – nerdybeardo

+0

Oui, ils vont tous les deux résider sur le même domaine – Pseudonym

Répondre

2

façon la plus simple serait de rendre ce javascript dans votre page:

<script type="text/javascript"> 
    window.UserID = '<%=HttpUtility.JavaScriptStringEncode(this.User.Identity.Name)%>'; 
</script> 

Maintenant, vous pouvez le référencer dans votre JS. Mais, plus important encore, si cet identifiant utilisateur n'est pas utilisé uniquement comme paramètre par défaut mais pour authentifier l'utilisateur, il s'agit d'un trou de sécurité.Normalement, le service REST devrait également être en mesure de regarder User.Identity.Name au lieu de le recevoir comme argument.

+0

Qu'en est-il du cryptage sur le serveur, en le transmettant à JS comme vous l'avez dit plus haut, puis décrypter dans le service Web? Pourriez-vous élaborer sur la sécurité de faire quelque chose comme ça? – Pseudonym

+0

Oui, vous pourriez faire quelque chose comme ça avec le cryptage. Mais - vous devez ensuite vous assurer que les données chiffrées ne sont pas réutilisées - par exemple, chiffrez également un horodatage et, lors du décryptage, vérifiez que l'horodatage est dans les X dernières minutes. Sinon, quelqu'un pourrait voler le nom d'utilisateur crypté une fois et continuer à l'utiliser pour simuler l'authentification. –

+0

Merci pour votre aide, c'est la solution que nous allons utiliser – Pseudonym

1

Normalement, le nom d'utilisateur est fourni par le client pour commencer. Il est ensuite vérifié côté serveur (en utilisant l'authentification nécessaire, par exemple un mot de passe). Si elle a été vérifiée du côté serveur (dans votre cas, cela doit provenir d'un service Web WCF car ASMX ne fonctionne pas bien avec REST), alors vous pouvez être sûr que c'est correct - plus vous avez déjà le nom d'utilisateur du côté client. Comme Knaģis l'a souligné, vous pouvez l'obtenir en utilisant un tag ASPX, en supposant que la page est une page ASPX et non HTML.

0

Si vous souhaitez simplement avoir le nom d'utilisateur du côté client, les autres réponses expliquent comment procéder.
Mais comme vous l'avez indiqué, ce est un risque de sécurité. Quelqu'un peut modifier les données sur le client et usurper l'identité d'un autre utilisateur.

La bonne façon de le faire:

  1. Une fois qu'un utilisateur se connecte avec succès, un Guid est émis qui identifie de façon unique cet utilisateur.
  2. Le repère est le jeton qui est enregistré sur le client et transmis au serveur pas le nom d'utilisateur.
  3. Tous les services Web reçoivent le nom d'utilisateur Guid pas le nom d'utilisateur.
  4. Le serveur dispose d'un dictionnaire qui convertit le Guid en nom d'utilisateur d'origine.

Une autre option peut être à encrypt le nom d'utilisateur et de transmettre la valeur cryptée au WebService. Le webservice devra déchiffrer la valeur afin d'obtenir le nom d'utilisateur.

+0

Certainement une bonne suggestion, ma question de compteur à ce serait: est-il un moyen de le faire sans modifier le service Web existant tel quel? – Pseudonym

+0

Eh bien, si votre service web reçoit ** UNIQUEMENT ** un nom d'utilisateur, et renvoie des informations basées uniquement sur cela - alors vous n'avez probablement pas le choix, car il y a un sérieux problème de sécurité/conception ici. Sur le plan positif, que vous choisissiez d'utiliser un GUID OU un nom d'utilisateur crypté - C'est toujours une valeur de chaîne pour ne pas casser le WSDL, tout ce que vous avez à faire est de changer la logique interne du Webservice – Blachshma

Questions connexes