Я использую Response.Redirect для перенаправления пользователей на другой сервер для загрузки файла, а другой сервер проверяет заголовок, чтобы убедиться, что он пришел с правильного сервера ... однако кажется, что Response.Redirect удаляет заголовки из ответа .
Кто-нибудь знает, как я могу вернуть заголовки? Я пробовал:
Response.AddHeader("Referer", "www.domain.com");
Но получающая страница проверяет ложность, когда я проверяю, установлен ли заголовок реферера.
Любые предложения, как я могу заставить это работать, кроме отображения кнопки, которую пользователь может нажать (я бы хотел, чтобы URL-адрес был скрыт от пользователя, насколько это возможно).





Я не думаю, что это возможно. То, что вы отправляете обратно клиенту, - это заголовок Location, который говорит клиенту загрузить указанную страницу вместо страницы, которую он изначально запрашивал. В этом случае клиент не переходит по ссылке и, следовательно, не устанавливает заголовок реферера. По сути, это как если бы пользователь ввел URL-адрес перенаправления в адресную строку в своем браузере.
Вы можете сохранить реферер в сеансе или закодировать его в URL-адресе в качестве параметра запроса. Как и в случае с ReturnUrl при входе в формы.
Server.Transfer вариант?
Однако есть некоторые предостережения, на которые вам нужно будет обратить внимание. НАПРИМЕР. Сохраняет исходный URL, авторизацию и т. д. Подробнее в ссылке.
В этом случае может быть полезно сохранить исходный URL-адрес.
Заголовок реферера, который получает ваш второй сервер, генерируется браузером, и маловероятно, что вы сможете изменить его каким-либо разумным образом.
Вы пытались добавить реферер к URL-адресу, а затем вместо этого читать его на своем втором сервере?
Response.Redirect("url?Referer = " + Server.UrlEncode(Request.UrlReferrer));
вам нужно добавить дополнительную обработку безопасности вокруг этого параметра, так как клиент может свободно вмешиваться в него
Что ж, это зависит от того, что именно делается. Из исходного вопроса немного сложно понять, проблема это или нет. Мало что можно сказать о том, что защищается и почему. Или это вообще проверка безопасности.
Установите файл cookie аутентификации (с хешем с ключом и 5-минутным истечением срока действия), отправьте ответ перенаправления, браузер отправит новый запрос на второй сервер (если это тот же домен) вместе с auth coookie, второй сервер проверяет cookie, гарантирует, что только первый сервер мог установить его, и отправляет контент обратно в браузер.
Это будет противоречить заголовку Referer (sic) определение:
The Referer[sic] request-header field allows the client to specify, for the server's benefit, the address (URI) of the resource from which the Request-URI was obtained (the "referrer", although the header field is misspelled.)
Если вы перенаправляете, это явно не тот случай, чтобы добавить этот заголовок.
Если вам нужна эта информация, попробуйте использовать cookie или какую-либо переменную сеанса, или, что еще лучше, переменную в URL-адресе, как вам уже сказали.
Если перенаправление относится к тому же процессу, я бы использовал значение сеанса для хранения URI реферера, чтобы вторичная страница могла его забрать. Я использую это в своей системе для поддержания реферера между перенаправлением http-соединений в нашу https-систему.
Что, если пользователь делает два запроса одновременно? Я знаю, это почти невозможно, но кто знает ...
Хороший вопрос. Я подозреваю, что второй запрос перезапишет значение Session ["referrer"], которое я создал, однако мой код уже сохранил первый запрос в таблице БД, поэтому он у меня все еще есть для целей отчетности, но в этом сценарии излишний.
Доступен HTML-хак.
<form action = "http://url.goes.here" id = "test" method = "GET"></form>
<script type = "text/javascript">
document.getElementById("test").submit();
</script>
Если вам нужно запустить это из кода, это тоже можно сделать:
Response.Write( @"<form action='http://url.goes.here' id='test' method='GET'></form>
<script type='text/javascript'>
document.getElementById('test').submit();
</script> ");
Как мог бы заметить Инкель, это вольная интерпретация спецификации Referer [sic]. Но он будет делать то, что вы хотите.
Да, это единственное, что у меня работало как в IE7, так и в FF3.
вам нужно избежать " в вашем C#
+1 к комментарию инкель выше.
Хотя, если вам не важна спецификация и вы просто хотите это сделать, вы можете избежать использования Response.Redirect и вместо этого самостоятельно создавать заголовки ответов.
Response.StatusCode = 302; //temp redirect
Response.Headers.Add("Location", "your/url/here");
Response.Headers.Add("Referer", "something.com");
Response.End();
Это не в моей голове, возможно, вам понадобится еще кое-что в заголовке ответа.
Вот версия предыдущей, которая мне подходит:
default.asp
servername = Lcase(Request.ServerVariables("SERVER_NAME"))
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", "http://yoursite"
Response.AddHeader "Referer", servername
Response.End()
Я не предлагаю публиковать - большинство веб-сайтов блокируют это.
просто используйте javascript document.location = '<%:yourURL%>;';, который автоматически загрузит новую страницу. это хорошо работает для меня, потому что ответ перенаправления не включает реферер.
Я знаю, что это старый, но я наткнулся на него, пытаясь сделать то же самое.
Я не хотел добавлять его в URL-адрес, так как он как бы загрязнял URL-адрес тем, что мне там не нужно. Кроме того, я не хотел, чтобы люди случайно добавляли этот URL в закладки. Поэтому я использовал файлы cookie для добавления своих данных;
string token = vwrApi.GetAuthenticationToken(userId);
Response.Cookies.Add(new HttpCookie("VwrAuthorization", token));
Response.Redirect(returnUrl, true);
Конечно, это зависит от вашей способности изменить место, где целевой сервер ищет информацию, но, по крайней мере, это другой вариант.
Вам нужно будет отправить ответ статуса 307 и установить в заголовке местоположения пункт назначения, на который должен быть перенаправлен пользователь. Это сохранит исходный заголовок referer [sic] нетронутым.
HttpContext.Current.Response.StatusCode = 307;
HttpContext.Current.Response.AddHeader("Location", "http://stackoverflow.com");
HttpContext.Current.Response.End();
Это не работает так, как это соответствует вопросу. Перенаправленный запрос не имеет ожидаемой строки реферала (хотя вы это сказали).
Server.Transfer - это вариант, только если он находится на одном сервере, верно? В этом случае мне нужно перенаправить на другой сервер, поэтому, вероятно, это не сработает :(