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.


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();

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


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">

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


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());
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.