Comment puis-je obtenir un URL de référence dans ASP.NET Core MVC?

96

J'essaie de migrer un formulaire Web ASP.NET MVC vers ASP.NET Core MVC. Actuellement, j'ai des problèmes avec la Request.UrlReferrerclasse.

La ligne originale est:

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

Cependant, avec ASP.NET Core, UrlReferrer n'est pas disponible. J'ai trouvé ce qui suit:

    Request.Headers["Referer"]

qui renvoie StringValues ​​au lieu d'une String. Je ne sais pas si je devrais essayer d'utiliser celui-ci ou s'il existe d'autres solutions à cette situation. Request.ServerVariablesn'est pas non plus disponible ou peut-être que je n'ai pas l'espace de noms. Mes espaces de noms sont les suivants:

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

J'apprécierais vraiment que quelqu'un puisse me diriger dans la bonne direction.

Kemal Tezer Dilsiz
la source
1
Certains sites comme Google ne vous donneront pas le référent pour des raisons de sécurité. Des yeux de Google: Google ne veut pas que vous voyiez le texte de recherche qui ferait partie du référent.
Benjamin Abt
FYI: URL Referer n'est pas fiable.
Gagne

Réponses:

147

Tu y es presque. La StringValuesclasse est juste un type utilisé par ASP.NET pour représenter efficacement les chaînes dans le framework. Surtout dans l' HttpContextobjet. Vous pouvez simplement l'appeler ToString()pour le convertir en chaîne:

string referer = Request.Headers["Referer"].ToString();
Henk Mollema
la source
Considérez-vous que c'est une façon fiable de le faire? Existe-t-il des moyens alternatifs?
Kemal Tezer Dilsiz
4
Il est fiable en termes d'accès à la propriété à partir des en-têtes de demande envoyés par le client. Cependant, je ne considérerais pas la valeur de l'en-tête du référent envoyé par le client comme fiable car il est très facile à tempérer.
Henk Mollema
66
Pour ceux qui sont curieux de savoir si Referer est mal orthographié dans la réponse, ce n'est pas le cas. Bien que Referrer soit l'orthographe correcte, ils ont fait une faute d'orthographe dans la spécification HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank Rem
1
Vous pouvez trouver tout ce qui concerne les migrations de gestionnaires et de modules HTTP vers ASP.net Core dans: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH
1
@FrankRem Knot que Aye'm ah speling geenious, mais c'est assez drôle. Le coupable qui l'a mal orthographié a-t-il été déniché?
Michael Tranchida
44

Depuis asp.net core 2, utilisez GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Eric Herlitz
la source
Merci d'avoir partagé ça!
Grimm
Cela doit avoir été supprimé dans 3
Snipe3000
1
Devrait toujours être dans 3 @ Snipe3000 docs.microsoft.com/en-us/dotnet/api
Daniel
8

Voici comment j'ai obtenu le référent d'URL: -

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Intesar Alam
la source
Comment accéder au contexte dans la page de rasoir comme vous l'avez montré dans cet exemple? J'ai ajouté le code mais le contexte n'est pas défini.
ZedZip
Je l'obtiens à partir de la classe WebViewPage de System.Web.Mvc
Intesar Alam
7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

presque la même chose que la réponse acceptée sans la chaîne magique

Souhaieb Besbes
la source
Mais faut-il un Nugetpackage ( Microsoft.AspNetCore.Server.Kestrel) ... cela a-t-il également été testé pour fonctionner IISExpress? SSL? etc.?
Serj Sagan
1
@SerjSagan à mon avis, la coïncidence du code fournie par la sécurité de type (par opposition aux chaînes magiques pour les autres solutions) l'emporte largement sur le nuget supplémentaire, comme pour l'hébergement, car il repose sur Kestrel, il devrait fonctionner dans tous les modes d'hébergement. SSL n'a pas été testé mais cela ne devrait pas faire de différence
Souhaieb Besbes
0

Cela fonctionne (testé dans .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestest une propriété des deux BaseControlleret HttpContext, vous pouvez donc l'obtenir de l'un ou de l'autre.

Par exemple, pour rediriger vers la page de référence à partir d'une action du contrôleur, procédez comme suit:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
MarredFromage
la source