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.


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

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


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

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


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());
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.