¿Cómo puedo obtener URL de referencia en ASP.NET Core MVC?

99

Estoy intentando migrar un formulario web ASP.NET MVC a ASP.NET Core MVC. Actualmente, tengo problemas con la Request.UrlReferrerclase.

La línea original es:

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

Sin embargo, con ASP.NET Core, UrlReferrer no está disponible. He encontrado lo siguiente:

    Request.Headers["Referer"]

que devuelve StringValues ​​en lugar de String. No estoy seguro de si debería intentar usar este o si hay otras soluciones a esta situación. Request.ServerVariablestampoco está disponible o tal vez no tengo el espacio de nombres. Mis espacios de nombres son los siguientes:

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

Realmente agradecería que alguien me pueda dirigir en la dirección correcta.

Kemal Tezer Dilsiz
fuente
1
Algunos sitios como Google no le darán el referente por razones de seguridad. Desde los ojos de Google: Google no quiere que vea el texto de búsqueda que sería parte del remitente.
Benjamin Abt
FYI: URL Referer no es confiable.
Gana el

Respuestas:

154

Ya casi estás ahí. La StringValuesclase es solo un tipo que ASP.NET usa para representar de manera eficiente cadenas en el marco. Especialmente en el HttpContextobjeto. Simplemente puede llamarlo ToString()para convertirlo en una cadena:

string referer = Request.Headers["Referer"].ToString();
Henk Mollema
fuente
1
¿Consideraría que esta es una forma confiable de hacerlo? ¿Existen formas alternativas?
Kemal Tezer Dilsiz
4
Es confiable en términos de acceder a la propiedad desde los encabezados de solicitud que envía el cliente. Sin embargo, no consideraría confiable el valor del encabezado de referencia que envía el cliente, ya que es muy fácil de moderar.
Henk Mollema
70
Para aquellos que sienten curiosidad por saber si Referer está mal escrito en la respuesta, no lo es. Aunque Referrer es la ortografía correcta, cometieron errores ortográficos en la especificación HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank
1
Puede encontrar todo lo relacionado con las migraciones de controladores y módulos HTTP a ASP.net Core en: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH
1
@FrankRem Knot that Aye'm ah hablando geenious, pero eso es bastante gracioso. ¿Se ha descubierto al culpable que lo escribió mal?
Michael Tranchida
48

A partir del uso de asp.net core 2 GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Eric Herlitz
fuente
Esto debe haberse eliminado en 3
Snipe3000
2
Debería estar todavía en 3 @ Snipe3000 docs.microsoft.com/en-us/dotnet/api/…
Daniel
9

Así es como obtuve URL de referencia: -

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Intesar Alam
fuente
¿Cómo acceder al contexto en la página de la maquinilla de afeitar como lo mostró en ese ejemplo? He agregado el código pero el contexto no está definido.
ZedZip
Lo obtengo de la clase WebViewPage de System.Web.Mvc
Intesar Alam
7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

casi lo mismo que la respuesta aceptada sin la cadena mágica

Souhaieb Besbes
fuente
Pero, ¿requiere un Nugetpaquete ( Microsoft.AspNetCore.Server.Kestrel) ... también se ha probado que funcione IISExpress? SSL? etc.
Serj Sagan
1
@SerjSagan, en mi opinión, la confianza del código proporcionada por la seguridad de tipos (en oposición a las cadenas mágicas para las otras soluciones) supera en gran medida el nuget adicional, en cuanto al alojamiento, ya que se basa en kestrel, debería funcionar en todos los modos de alojamiento. SSL no se probó, pero no debería marcar la diferencia
Souhaieb Besbes
1

Esto funciona (probado en .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestes una propiedad de ambos ControllerBase(y, por Controllerlo tanto, también) y HttpContext, por lo que puede obtenerla de cualquiera.

Por ejemplo, para redirigir a la página de referencia desde una acción del controlador, simplemente haga esto:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
MarredQueso
fuente