HttpWebRequest cookie avec vide de domaine
J'ai un ASP.NET MVC action qui envoie une requête à un autre serveur via HttpWebRequest. J'aimerais inclure tous les cookies dans l'action initiale de la demande dans la nouvelle demande. Une partie du Système.Web.HttpCookies dans la demande initiale ont vide les valeurs de domaine (c'est à dire ""), qui, apparemment, ne cause pas de problèmes. Lorsque je créer un Système.Net.Cookie en utilisant le nom, la valeur, le chemin d'accès, et de domaine de chacun de ces cookies et l'ajouter à la demande du CookieContainer, j'obtiens cette erreur:
"Du système.ArgumentException: Le paramètre "{0} " ne peut pas être une chaîne vide. Nom du paramètre: cookie.Le domaine"
Voici un code qui va lancer la même erreur (lorsque le cookie est ajouté):
var request = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add ( new Cookie ( "MyCookieName", "MyCookieValue", "/", "") );
MODIFIER
Je sorte de fixée à l'aide de "localhost" pour le domaine, au lieu de la valeur null ou une chaîne vide, la valeur de l'original HttpCookie. Donc, pourquoi un vide de domaine fonctionne pas pour le CookieContainer? Et ne HttpCookie utiliser une valeur vide pour indiquer localhost, ou dois-je trouver une autre solution à ce problème?
On dirait que vous êtes la construction d'un contournement de la page -- probablement pour le cross-site scripting? Je vais poster une réponse ci-dessous avec quelques informations de fond. Pour l'instant découvrez en.wikipedia.org/wiki/HTTP_cookie pour obtenir de la façon dont il fonctionne. Le nom de domaine est très important.
a une bonne réponse ci-dessous qui fonctionne, tout simplement. Je suis venu à la même conclusion dans mes tests avant de trouver sa réponse. En gros: demande.Les en-têtes.Ajouter(HttpRequestHeader.Cookie, "MyCookieName=MyCookieValue");
OriginalL'auteur MikeWyatt | 2010-12-16
Vous devez vous connecter pour publier un commentaire.
Avertissement:
Comme indiqué plus haut par @feroze, réglage de vos biscuits domaine localhost ne va pas très bien pour vous. Je suis en supposant que vous êtes en train de rédiger un assistant qui vous permet de tunnel de requêtes HTTP à l'étranger domaines. Notez que ce n'est pas la meilleure pratique et, dans beaucoup de cas n'est pas nécessaire (c'est à dire jQuery a beaucoup de la croix-cool-support de domaine intégré dans, voir aussi la nouvelle Spécification de la SCRO). Mais parfois, vous pourriez être coincé ce faire (c'est à dire la ressource externe est XML, et est sur un serveur qui ne prend pas en charge la SCRO).
Des Informations de fond sur le Biscuit Domaines et Comment Ils fonctionnent:
Si vous ne l'avez pas déjà jeter un oeil à Cookie HTTP: de Domaine et le Chemin d'accès sur Wikipédia - à peu près tout ce que vous devez savoir est là.
Lors de l'évaluation d'un témoin, le Domaine et le Chemin d'accès sont prises en compte par les deux le client (le "local" demandeur) et le serveur web (les "étrangers" répondeur). Lorsqu'un client demande une ressource, le client devrait seulement envoyer des "cookies" d'où ils correspondent au Domaine (ou plus générique domaine parent) et le Chemin (ou plus générique parent chemin d'accès) de l'URI demandée.
Navigateurs Web gérer cela correctement. Si un navigateur web a un cookie pour le domaine "localhost" et que vous demandez "google.com" par exemple, ces cookies pour le "localhost" domaine ne seront pas envoyés à la demande "google.com". - En fait, la plupart des navigateurs modernes ne sera pas seulement de ne pas les envoyer, ils vont ignorer complètement dans le Set-Cookie-têtes de la réponse qu'ils reçoivent (que l'on appelle les cookies tiers -- permettre l'acceptation des tiers les cookies dans votre navigateur web est un énorme vie privée/sécurité, - ne pas le faire!).
Il fonctionne dans l'autre sens aussi, même si c'est peu probable pour un client afin d'inclure un cookie tiers de la demande, si elle le fait, les étrangers serveur web est censé l'ignorer (et même certains cookies pour corriger domaines/les chemins, de manière à empêcher l'infâme super-cookie question. (c'est à dire Le serveur web hosting "example.com" doit ignorer les cookies appartenant à son domaine parent: ".com", parce que ".com" est un "public suffixe")).
Ce que Vous Devez Faire [si vous avez d']:
Le cours de l'action que je recommande pour vous, c'est quand vous lisez dans votre client de cookies (je ne suis pas un MVC gars, mais régulièrement ASP.NET ce serait en fait la Demande.Les Cookies), de la boucle à travers eux (assurez-vous de filtrer votre propre site légitime de cookies, en particulier SessionId, etc-ou utiliser le Chemin correctement afin qu'ils ne soient envoyés vers cette page en premier lieu), puis ajouter un à un le temps de la sortant de la demande de collecte de témoins, de réécrire le nom de domaine "www.whatever.com" (par votre exemple, si vous êtes en train de faire ce, de façon dynamique, la charge de l'URL dans un nouvel Uri() de l'objet et de l'utilisation de l' .L'hôte de la propriété), puis définissez le Chemin d'accès à "/". -- Ce sera de construire le "Cookie" en-tête pour les sortants de la demande à l'étranger serveur web.
Lorsque cette requête renvoie à votre serveur, vous devez vérifier la réponse entrante pour les nouveaux cookies, ceux que les cookies peuvent être reconditionnés et envoyé à votre client de la même type de boucle que j'ai illustré dans le paragraphe précédent, sauf que vous aurez envie de réécriture d'Hôte à la Demande.Url.Accueil -- et vous aurez envie de définir le chemin du retour à "/", sauf si le chemin d'accès à votre genre de page est statique (je devine que ce n'est pas depuis que vous êtes en utilisant MVC), alors vous voulez le configurer pour qu'il Demande.Url.Cheminabsolu par exemple.
Bon Codage!
EDIT:
Aussi, vous devrez définir le X-Forwarded-For balise de sortants de la demande, de sorte que le site web que vous appelez ne pense pas que votre serveur web est un seul client qui est à l'été de spamming de la merde hors d'eux.
OriginalL'auteur BrainSlugs83
Un peu de fond
Cela se produit parce que CookieContainer est côté client conteneur conçu pour être réutilisé sur plusieurs HttpWebRequest. La réutilisation elle fournit les attendus cookie comportement que les cookies définis par l'hôte distant sont envoyés à chaque HttpWebRequests ciblées sur le même hôte.
Comme un résultat de la réutilisation, un CookieContainer peut en fait contenir des cookies à partir de la demande multiple et\ou des hôtes.
Ainsi, afin de déterminer lequel des cookies dans le conteneur doivent être envoyés avec un particulier HttpWebRequest pour certains d'accueil (domaine), CookieContainer examine le Domaine et le Chemin d'accès à la propriété.
C'est pourquoi un Cookie dans un CookieContainer doit avoir un Domaine de validité.
A l'inverse, sur la côté serveur cookies sont fournis par l'intermédiaire d'un type différent, CookieCollection qui d'une simple liste de témoins, sans aucun supplément de logique.
Plus précisément, dans votre cas, lors de la copie des cookies à partir de la CookieCollection à la CookieContainer vous devez définir la propriété de Domaine de chaque cookie dans le domaine de votre allez de l'avant la demande, de sorte que HttpWebRequest saura inclure les cookies lors de l'envoi de la demande.
OriginalL'auteur zahical
Pas sur que cela résout votre problème. Mais pour ajouter des cookies sans le "Domaine" de la propriété, vous devez ajouter les en-têtes les cookies à l'aide de
HttpRequestHeader.Cookie
comme suit.Espère que cela aide!
OriginalL'auteur Angelisho
Vous essayez d'obtenir les cookies envoyés à localhost, droit?
Pourquoi ne pas faire quelque chose comme cela, où que vous donnez à votre propre machine un nom réel:
Votre navigateur ou d'une application ne connaissent pas la différence et envoyer des cookies à myname.com si c'est là que le cookie appartient.
Informations détaillées:
OriginalL'auteur David d C e Freitas