Wie kann ich Url Referrer in ASP.NET Core MVC erhalten?

94

Ich versuche, ein ASP.NET MVC-Webformular auf ASP.NET Core MVC zu migrieren. Derzeit habe ich Probleme mit der Request.UrlReferrerKlasse.

Die ursprüngliche Zeile lautet:

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

Mit ASP.NET Core ist UrlReferrer jedoch nicht verfügbar. Ich habe folgendes gefunden:

    Request.Headers["Referer"]

Dies gibt StringValues ​​anstelle eines Strings zurück. Ich bin mir nicht sicher, ob ich versuchen sollte, diese zu verwenden, oder ob es andere Lösungen für diese Situation gibt. Request.ServerVariablesist auch nicht verfügbar oder vielleicht habe ich den Namespace nicht. Meine Namespaces lauten wie folgt:

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

Ich würde mich sehr freuen, wenn mich jemand in die richtige Richtung lenken kann.

Kemal Tezer Dilsiz
quelle
1
Einige Websites wie Google geben Ihnen aus Sicherheitsgründen keinen Verweis. Aus Google-Augen: Google möchte nicht, dass der Suchtext angezeigt wird, der Teil des Verweisers ist.
Ben
Zu Ihrer Information: URL Referer ist nicht zuverlässig.
Gewinnen Sie den

Antworten:

144

Du bist fast da. Die StringValuesKlasse ist nur ein Typ, den ASP.NET verwendet, um Zeichenfolgen im Framework effizient darzustellen. Besonders im HttpContextObjekt. Sie können es einfach aufrufen ToString(), um es in einen String zu konvertieren:

string referer = Request.Headers["Referer"].ToString();
Henk Mollema
quelle
Würden Sie dies als zuverlässige Methode betrachten? Gibt es alternative Möglichkeiten?
Kemal Tezer Dilsiz
4
Es ist zuverlässig in Bezug auf den Zugriff auf die Eigenschaft über die vom Client gesendeten Anforderungsheader. Ich würde jedoch den Wert des vom Client gesendeten Referrer-Headers nicht als zuverlässig betrachten, da er sehr leicht zu temperieren ist.
Henk Mollema
63
Für diejenigen, die neugierig sind, ob Referer in der Antwort falsch geschrieben ist, ist dies nicht der Fall. Obwohl Referrer die richtige Schreibweise ist, haben sie die Rechtschreibfehler in der HTTP-Spezifikation english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank Rem
1
Sie finden alle Informationen zu Migrationen von HTTP-Handlern und -Modulen zu ASP.net Core unter: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH
1
@FrankRem Knoten, dass Aye ah buchstabiert geenious, aber das ist ziemlich lustig. Wurde der Täter, der es falsch geschrieben hat, aufgespürt?
Michael Tranchida
43

Ab asp.net Core 2 verwenden GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Eric Herlitz
quelle
Danke, dass du das geteilt hast!
Grimm
Dies muss in 3
Snipe3000
1
Sollte noch in 3 @ Snipe3000 docs.microsoft.com/en-us/dotnet/api/… sein
Daniel
8

Hier ist, wie ich URL-Referrer bekam: -

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Intesar Alam
quelle
Wie greife ich auf den Kontext auf der Rasierseite zu, wie Sie in diesem Beispiel gezeigt haben? Ich habe den Code hinzugefügt, aber der Kontext ist undefiniert.
ZedZip
Ich erhalte es von der WebViewPage-Klasse von System.Web.Mvc
Intesar Alam
7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

fast das gleiche wie die akzeptierte Antwort ohne die magische Schnur

Souhaieb Besbes
quelle
Benötigt man aber ein NugetPaket ( Microsoft.AspNetCore.Server.Kestrel) ... wurde dies auch getestet, um zu funktionieren IISExpress? SSL? etc.?
Serj Sagan
1
@SerjSagan Meiner Meinung nach überwiegt der Code-Cofidence, der durch Typensicherheit bereitgestellt wird (im Gegensatz zu magischen Zeichenfolgen für die anderen Lösungen), das zusätzliche Nuget wie beim Hosting weitgehend, da es auf Turmfalke basiert und in allen Hosting-Modi funktionieren sollte. SSL wurde nicht getestet, aber es sollte keinen Unterschied machen
Souhaieb Besbes