ฉันจะรับ Url Referrer ใน ASP.NET Core MVC ได้อย่างไร


99

ฉันพยายามย้ายเว็บฟอร์ม ASP.NET MVC ไปยัง ASP.NET Core MVC ขณะนี้ฉันมีปัญหากับRequest.UrlReferrerชั้นเรียน

บรรทัดเดิมคือ:

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

อย่างไรก็ตามด้วย ASP.NET Core จะไม่สามารถใช้ UrlReferrer ได้ ฉันพบสิ่งต่อไปนี้:

    Request.Headers["Referer"]

ซึ่งส่งคืน StringValues ​​แทน String ฉันไม่แน่ใจว่าควรลองใช้อันนี้หรือมีวิธีแก้ไขอื่น ๆ สำหรับสถานการณ์นี้หรือไม่ Request.ServerVariablesยังใช้ไม่ได้หรือบางทีฉันอาจไม่มีเนมสเปซ เนมสเปซของฉันมีดังนี้:

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

ฉันจะขอบคุณมากถ้ามีใครสามารถชี้นำฉันไปในทิศทางที่ถูกต้อง


1
บางเว็บไซต์เช่น Google จะไม่ให้คุณเป็นผู้อ้างอิงด้วยเหตุผลด้านความปลอดภัย จากสายตาของ Google: Google ไม่ต้องการให้คุณเห็นข้อความค้นหาซึ่งจะเป็นส่วนหนึ่งของผู้อ้างอิง
Benjamin Abt

FYI: URL Referer ไม่น่าเชื่อถือ
ลุ้นรับรางวัล

คำตอบ:


154

เกือบเสร็จแล้ว StringValuesระดับเป็นเพียงประเภทการใช้งานได้อย่างมีประสิทธิภาพ ASP.NET แทนสตริงในกรอบ โดยเฉพาะอย่างยิ่งในHttpContextวัตถุ คุณสามารถเรียกToString()ใช้เพื่อแปลงเป็นสตริง:

string referer = Request.Headers["Referer"].ToString();

1
คุณคิดว่านี่เป็นวิธีที่เชื่อถือได้หรือไม่? มีวิธีอื่นหรือไม่?
Kemal Tezer Dilsiz

4
มีความน่าเชื่อถือในแง่ของการเข้าถึงทรัพย์สินจากส่วนหัวของคำขอที่ลูกค้าส่งมา อย่างไรก็ตามฉันจะไม่พิจารณาว่าค่าของส่วนหัวผู้อ้างอิงที่ลูกค้าส่งมานั้นเชื่อถือได้เพราะมันง่ายมากที่จะอารมณ์
Henk Mollema

70
สำหรับผู้ที่สงสัยว่า Referer สะกดผิดใน anwer หรือไม่ แม้ว่า Referrer จะสะกดถูกต้อง แต่พวกเขาก็สะกดผิดในข้อกำหนด HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank

1
คุณสามารถค้นหาข้อมูลทั้งหมดที่เกี่ยวข้องกับการโยกย้ายของตัวจัดการ HTTP และโมดูลไปยัง ASP.net Core ได้ใน: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH

1
@ FrankRem Knot ว่า Aye'm ah speling geenious แต่มันตลกดี ผู้ร้ายที่สะกดผิดถูกคุ้ยเขี่ยออกไปหรือไม่?
Michael Tranchida


9

นี่คือวิธีที่ฉันได้รับผู้อ้างอิง url: -

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">

จะเข้าถึงบริบทในหน้ามีดโกนตามที่คุณแสดงในตัวอย่างนั้นได้อย่างไร ฉันได้เพิ่มรหัสแล้ว แต่ไม่ได้กำหนดบริบท
ZedZip

ฉันได้รับจากคลาส WebViewPage ของ System.Web.Mvc
Intesar Alam

7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

เกือบจะเหมือนกับคำตอบที่ยอมรับโดยไม่มีสายเวทย์


แต่ต้องใช้Nugetแพ็คเกจ ( Microsoft.AspNetCore.Server.Kestrel) ... ยังได้รับการทดสอบว่าใช้งานได้IISExpressหรือไม่ SSLเหรอ? ฯลฯ ?
Serj Sagan

1
@SerjSagan ในความเห็นของฉันรหัส cofidence ที่ได้รับจากประเภทความปลอดภัย (เนื่องจากมีการใช้สายเวทย์มนตร์สำหรับโซลูชันอื่น ๆ ) ส่วนใหญ่มีค่ามากกว่านักเก็ตเพิ่มเติมสำหรับโฮสติ้งเนื่องจากต้องอาศัย kestrel จึงควรทำงานในทุกโหมดโฮสติ้ง ไม่ได้ทดสอบ SSL แต่ไม่ควรสร้างความแตกต่าง
Souhaieb Besbes

1

ใช้งานได้ (ทดสอบใน. NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestเป็นคุณสมบัติของทั้งสองอย่างControllerBase(และControllerด้วยเช่นกัน) และHttpContextคุณจะได้รับจากอย่างใดอย่างหนึ่ง

ตัวอย่างเช่นหากต้องการเปลี่ยนเส้นทางไปยังหน้าอ้างอิงจากการดำเนินการของคอนโทรลเลอร์ให้ทำสิ่งนี้:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.