Bagaimana saya bisa mendapatkan Perujuk Url di ASP.NET Core MVC?

99

Saya mencoba untuk memigrasi formulir web ASP.NET MVC ke ASP.NET Core MVC. Saat ini, saya mengalami masalah dengan Request.UrlReferrerkelas.

Baris aslinya adalah:

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

Namun, dengan ASP.NET Core, UrlReferrer tidak tersedia. Saya telah menemukan yang berikut ini:

    Request.Headers["Referer"]

yang mengembalikan StringValues, bukan String. Saya tidak yakin apakah saya harus mencoba menggunakan yang ini atau jika ada solusi lain untuk situasi ini. Request.ServerVariablesjuga tidak tersedia atau mungkin saya tidak memiliki namespace. Ruang nama saya adalah sebagai berikut:

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

Saya akan sangat menghargai jika seseorang dapat mengarahkan saya ke arah yang benar.

Kemal Tezer Dilsiz
sumber
1
Beberapa situs seperti Google tidak akan memberi Anda perujuk karena alasan keamanan. Dari mata Google: Google tidak ingin Anda melihat teks pencarian yang akan menjadi bagian dari referer.
Benjamin Abt
FYI: Perujuk URL tidak dapat diandalkan.
Menangkan

Jawaban:

154

Kamu hampir sampai. The StringValueskelas hanya jenis penggunaan ASP.NET untuk secara efisien mewakili string dalam rangka. Terutama pada HttpContextobyeknya. Anda bisa memanggilnya ToString()untuk mengubahnya menjadi string:

string referer = Request.Headers["Referer"].ToString();
Henk Mollema
sumber
1
Apakah Anda menganggap ini sebagai cara yang dapat diandalkan untuk melakukannya? Apakah ada cara alternatif?
Kemal Tezer Dilsiz
4
Ini dapat diandalkan dalam hal mengakses properti dari header permintaan yang dikirim oleh klien. Namun, saya tidak akan menganggap nilai tajuk perujuk yang dikirim oleh klien dapat diandalkan karena sangat mudah marah.
Henk Mollema
70
Bagi mereka yang penasaran apakah Referer salah eja di jawaban, sebenarnya tidak. Meskipun Pengarah adalah ejaan yang benar, mereka membuat kesalahan ejaan dalam spesifikasi HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank
1
Anda dapat menemukan semua yang berhubungan dengan migrasi penangan HTTP dan modul ke ASP.net Core di: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH
1
@FrankRem Simpul bahwa Aye'm ah speling geenious, tapi itu cukup lucu. Apakah pelakunya yang salah eja telah ditemukan?
Michael Tranchida
48

Pada penggunaan asp.net inti 2 GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Eric Herlitz
sumber
Ini harus dihapus dalam 3
Snipe3000
2
Harus tetap dalam 3 @ Snipe3000 docs.microsoft.com/en-us/dotnet/api/…
Daniel
9

Inilah cara saya mendapatkan pengarah url: -

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Intesar Alam
sumber
Bagaimana cara mengakses Konteks di halaman pisau cukur seperti yang Anda tunjukkan dalam contoh itu? Saya telah menambahkan kode tetapi Konteks tidak ditentukan.
ZedZip
Saya mendapatkannya dari kelas WebViewPage System.Web.Mvc
Intesar Alam
7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

hampir sama dengan jawaban yang diterima tanpa benang ajaib

Souhaieb Besbes
sumber
Tetapi apakah memerlukan Nugetpaket ( Microsoft.AspNetCore.Server.Kestrel) ... apakah ini juga telah diuji untuk berfungsi IISExpress? SSL? dll.?
Serj Sagan
1
@SerjSagan menurut pendapat saya kode cofidence yang disediakan oleh jenis keamanan (sebagai lawan dari string ajaib untuk solusi lain) sebagian besar lebih besar daripada nuget tambahan, seperti untuk hosting, karena bergantung pada kestrel itu harus bekerja di semua mode hosting. SSL tidak diuji tetapi seharusnya tidak membuat perbedaan
Souhaieb Besbes
1

Ini berfungsi (diuji di .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestadalah properti dari keduanya ControllerBase(dan karenanya Controllerjuga) dan HttpContext, jadi Anda bisa mendapatkannya dari keduanya.

Misalnya, untuk mengalihkan ke halaman rujukan dari tindakan pengontrol, cukup lakukan ini:

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