Jak uzyskać stronę odsyłającą do adresu URL w ASP.NET Core MVC?

99

Próbuję przeprowadzić migrację formularza internetowego ASP.NET MVC do ASP.NET Core MVC. Obecnie mam problem z Request.UrlReferrerklasą.

Oryginalna linia to:

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

Jednak w przypadku ASP.NET Core UrlReferrer nie jest dostępny. Znalazłem:

    Request.Headers["Referer"]

która zwraca StringValues ​​zamiast String. Nie jestem pewien, czy powinienem spróbować skorzystać z tego, czy są jakieś inne rozwiązania tej sytuacji. Request.ServerVariablesjest również niedostępny lub może nie mam przestrzeni nazw. Moje przestrzenie nazw są następujące:

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

Byłbym naprawdę wdzięczny, gdyby ktoś mógł skierować mnie we właściwym kierunku.

Kemal Tezer Dilsiz
źródło
1
Niektóre witryny, takie jak Google, nie udostępniają referencji ze względów bezpieczeństwa. Z oczu Google: Google nie chce, abyś zobaczył tekst wyszukiwania, który byłby częścią strony odsyłającej.
Benjamin Abt
FYI: URL Referer nie jest wiarygodny.
Wygraj

Odpowiedzi:

154

Jesteś prawie na miejscu. StringValuesKlasa jest po prostu rodzajem zastosowania ASP.NET skutecznie reprezentują ciągi w ramach. Szczególnie w HttpContextobiekcie. Możesz go po prostu wywołać ToString(), aby przekonwertować go na ciąg:

string referer = Request.Headers["Referer"].ToString();
Henk Mollema
źródło
1
Czy uznałbyś to za niezawodny sposób na zrobienie tego? Czy są jakieś alternatywne sposoby?
Kemal Tezer Dilsiz
4
Jest niezawodny pod względem dostępu do właściwości z nagłówków żądań wysyłanych przez klienta. Jednak nie uważałbym wartości nagłówka strony odsyłającej wysyłanej przez klienta za wiarygodną, ​​ponieważ jest bardzo łatwy do złagodzenia.
Henk Mollema
70
Dla tych, którzy są ciekawi, czy Referer jest błędnie napisany w odpowiedzi, tak nie jest. Chociaż referrer to poprawna pisownia, popełnili błąd w specyfikacji HTTP english.stackexchange.com/questions/42630/referer-or-referrer/ ...
Frank,
1
Wszystkie informacje dotyczące migracji modułów obsługi HTTP i modułów do ASP.net Core można znaleźć w: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH
1
@FrankRem Knot that Aye'm ah speling geenious, ale to całkiem zabawne. Czy sprawca, który pomylił się, został wytropiony?
Michael Tranchida
48

Od użycia asp.net core 2 GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Eric Herlitz
źródło
Dzięki za udostępnienie tego!
Grimm,
To musiało zostać usunięte w 3
Snipe3000
2
Powinien nadal znajdować się w 3 @ Snipe3000 docs.microsoft.com/en-us/dotnet/api/ ...
Daniel
9

Oto jak otrzymałem odsyłacz URL: -

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Intesar Alam
źródło
Jak uzyskać dostęp do kontekstu na stronie brzytwy, jak pokazano w tym przykładzie? Dodałem kod, ale kontekst jest niezdefiniowany.
ZedZip
Otrzymuję to z klasy WebViewPage z System.Web.Mvc
Intesar Alam
7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

prawie taka sama, jak zaakceptowana odpowiedź bez magicznego sznurka

Souhaieb Besbes
źródło
Ale czy wymaga Nugetpakietu ( Microsoft.AspNetCore.Server.Kestrel) ... czy to również zostało przetestowane do działania IISExpress? SSL? itp.?
Serj Sagan
1
@SerjSagan, moim zdaniem, współwystępowanie kodu zapewniane przez bezpieczeństwo typów (w przeciwieństwie do magicznych ciągów znaków dla innych rozwiązań) w dużej mierze przeważa nad dodatkowym nugetem, jeśli chodzi o hosting, ponieważ opiera się na pustułce, która powinna działać we wszystkich trybach hostingu. SSL nie został przetestowany, ale nie powinno to robić różnicy
Souhaieb Besbes,
1

To działa (testowane w .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestjest własnością obu ControllerBase(i dlatego Controllerteż) HttpContext, więc możesz ją uzyskać z obu.

Na przykład, aby przekierować do strony odsyłającej z akcji kontrolera, po prostu zrób to:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
MarredCheese
źródło