Как я могу получить URL-адрес реферера в ASP.NET Core MVC?

99

Я пытаюсь перенести веб-форму ASP.NET MVC на ASP.NET Core MVC. В настоящее время у меня проблемы с Request.UrlReferrerклассом.

Исходная строка:

    [HttpPost]
    public async Task<ActionResult> ContactUsFormSubmit(ContactUs request)
    {
        var siteUrl = Request.UrlReferrer.ToString().ToLower();
        ....
    }

Однако в ASP.NET Core UrlReferrer недоступен. Я обнаружил следующее:

    Request.Headers["Referer"]

который возвращает StringValues ​​вместо String. Я не уверен, стоит ли мне пытаться использовать это или есть другие решения этой ситуации. Request.ServerVariablesтакже недоступен или, возможно, у меня нет пространства имен. Мои пространства имен следующие:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

Я был бы очень признателен, если бы кто-нибудь направил меня в правильном направлении.

Кемаль Тезер Дилсиз
источник
1
Некоторые сайты, такие как Google, не предоставляют вам ссылку по соображениям безопасности. Глаза Google: Google не хочет, чтобы вы видели текст поиска, который был бы частью реферера.
Бенджамин Абт,
К вашему сведению: URL Referer ненадежен.
Победа

Ответы:

154

Ты почти там. StringValuesКласс только тип ASP.NET использует для эффективного представления строк в рамках. Особенно в HttpContextобъекте. Вы можете просто вызвать ToString()его, чтобы преобразовать его в строку:

string referer = Request.Headers["Referer"].ToString();
Хенк Моллема
источник
1
Считаете ли вы это надежным способом сделать это? Есть ли альтернативные пути?
Кемаль Тезер Дилсиз
4
Это надежно с точки зрения доступа к свойству из заголовков запросов, отправляемых клиентом. Однако я бы не стал считать значение заголовка реферера, отправляемого клиентом, надежным, поскольку его очень легко изменить.
Хенк Моллема
70
Для тех, кому интересно, неправильно ли написано Referer в ответе, это не так. Хотя «Реферер» - правильное написание, они сделали опечатку в спецификации HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Фрэнк
1
Вы можете найти все, что касается миграции обработчиков HTTP и модулей на ASP.net Core, в: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH
1
@FrankRem Узел, что да, я неплохо пишу, но это довольно забавно. Выявлен ли виновник, который сделал ошибку?
Майкл Транчида
48

Начиная с asp.net core 2 используйте GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Эрик Херлитц
источник
Это должно было быть удалено в 3
Snipe3000,
2
Должен по-прежнему быть в 3 @ Snipe3000 docs.microsoft.com/en-us/dotnet/api/…
Дэниел
9

Вот как я получил реферер URL: -

@{
string referer = Context.Request.Headers["Referer"].ToString();
Uri baseUri = new Uri(referer);}


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Интересар Алам
источник
Как получить доступ к контексту на странице бритвы, как вы показали в этом примере? Я добавил код, но контекст не определен.
ZedZip
Я получаю его из класса WebViewPage из System.Web.Mvc
Интесар Алам,
7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

var referer = ((FrameRequestHeaders)Request.Headers).HeaderReferer.FirstOrDefault();

почти такой же, как принятый ответ без волшебной строки

Сухайб Бесбес
источник
Но требуется ли Nugetpackage ( Microsoft.AspNetCore.Server.Kestrel) ... также было ли это протестировано для работы IISExpress? SSL? так далее.?
Серж Саган
1
@SerjSagan, на мой взгляд, надежность кода, обеспечиваемая безопасностью типов (в отличие от магических строк для других решений), в значительной степени перевешивает дополнительный nuget, что касается хостинга, поскольку он полагается на пустельгу, он должен работать во всех режимах хостинга. SSL не тестировался, но это не должно иметь значения
Суаиб Бесбес
1

Это работает (проверено в .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestявляется свойством как ControllerBase(и, следовательно, Controllerтоже), так иHttpContext , поэтому вы можете получить его от любого.

Например, чтобы перенаправить на ссылающуюся страницу из действия контроллера, просто сделайте следующее:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
MarredCheese
источник