Как я могу получить 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 Узел, что да, я неплохо пишу, но это довольно забавно. Выявлен ли виновник, который сделал ошибку?
— Майкл Транчида


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());
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.