Como posso obter o URL Referrer no ASP.NET Core MVC?

96

Estou tentando migrar um formulário da web ASP.NET MVC para ASP.NET Core MVC. Atualmente, estou tendo problemas com a Request.UrlReferrerclasse.

A linha original é:

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

No entanto, com ASP.NET Core, UrlReferrer não está disponível. Eu encontrei o seguinte:

    Request.Headers["Referer"]

que retorna StringValues ​​em vez de uma String. Não tenho certeza se devo tentar usar este ou se há alguma outra solução para esta situação. Request.ServerVariablestambém não está disponível ou talvez eu não tenha o namespace. Meus namespaces são os seguintes:

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

Eu realmente apreciaria se alguém pudesse me direcionar na direção certa.

Kemal Tezer Dilsiz
fonte
1
Alguns sites como o Google não fornecem o referenciador por motivos de segurança. Dos olhos do Google: o Google não quer que você veja o texto de pesquisa que faria parte do referenciador.
Benjamin Abt
FYI: URL Referer não é confiável.
Vitória de

Respostas:

147

Você está quase lá. A StringValuesclasse é apenas um tipo que o ASP.NET usa para representar cadeias de caracteres de forma eficiente na estrutura. Especialmente no HttpContextobjeto. Você pode simplesmente chamá ToString()-lo para convertê-lo em uma string:

string referer = Request.Headers["Referer"].ToString();
Henk Mollema
fonte
Você consideraria esta uma maneira confiável de fazer isso? Existem formas alternativas?
Kemal Tezer Dilsiz
4
É confiável em termos de acesso à propriedade a partir dos cabeçalhos de solicitação enviados pelo cliente. No entanto, eu não consideraria o valor do cabeçalho de referência sendo enviado pelo cliente confiável, pois é muito fácil de temperar.
Henk Mollema
66
Para aqueles que estão curiosos se Referer está incorreto na resposta, não é. Embora Referrer seja a grafia correta, eles cometeram erros ortográficos na especificação HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank Rem
1
Você pode encontrar todas as informações sobre migrações de manipuladores e módulos HTTP para ASP.net Core em: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH
1
@FrankRem Knot that Sim, estou falando muito bem, mas é muito engraçado. O culpado que digitou errado foi descoberto?
Michael Tranchida
44

A partir do asp.net core 2, use GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Eric Herlitz
fonte
Obrigado por compartilhar isso!
Grimm
Isso deve ter sido removido em 3
Snipe3000
1
Ainda deve estar em 3 @ Snipe3000 docs.microsoft.com/en-us/dotnet/api/…
Daniel
8

Aqui está como obtive o referenciador de url: -

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Intesar Alam
fonte
Como acessar o Contexto na página do razor como você mostrou naquele exemplo? Eu adicionei o código, mas o contexto é indefinido.
ZedZip
Estou recebendo da classe WebViewPage de System.Web.Mvc
Intesar Alam
7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

quase o mesmo que a resposta aceita sem o fio mágico

Souhaieb Besbes
fonte
Mas requer um Nugetpacote ( Microsoft.AspNetCore.Server.Kestrel) ... também foi testado para funcionar IISExpress? SSL? etc?
Serj Sagan
1
@SerjSagan, em minha opinião, a confirmação de código fornecida pela segurança de tipo (em oposição a strings mágicas para as outras soluções) supera amplamente o nuget adicional, quanto à hospedagem, uma vez que depende do kestrel, deve funcionar em todos os modos de hospedagem. SSL não foi testado, mas não deve fazer diferença
Souhaieb Besbes
0

Isso funciona (testado no .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requesté uma propriedade de ambos BaseControllere HttpContext, portanto, você pode obtê-lo de qualquer um deles.

Por exemplo, para redirecionar para a página de referência de uma ação do controlador, basta fazer o seguinte:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
MarredCheese
fonte