Làm cách nào để có được Liên kết giới thiệu Url trong ASP.NET Core MVC?


99

Tôi đang cố gắng di chuyển biểu mẫu web ASP.NET MVC sang ASP.NET Core MVC. Hiện tại, tôi đang gặp rắc rối với Request.UrlReferrerlớp học.

Dòng ban đầu là:

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

Tuy nhiên, với ASP.NET Core, UrlReferrer không khả dụng. Tôi đã tìm thấy những điều sau:

    Request.Headers["Referer"]

trả về StringValues ​​thay vì một Chuỗi. Tôi không chắc liệu mình có nên thử sử dụng giải pháp này hay có bất kỳ giải pháp nào khác cho tình huống này. Request.ServerVariablescũng không có sẵn hoặc có thể tôi không có không gian tên. Không gian tên của tôi như sau:

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

Tôi thực sự sẽ đánh giá cao nếu ai đó có thể hướng dẫn tôi đi đúng hướng.


1
Một số trang web như Google sẽ không cung cấp cho bạn người giới thiệu vì lý do bảo mật. Từ con mắt của Google: Google không muốn rằng bạn sẽ nhìn thấy văn bản tìm kiếm sẽ là một phần của giới thiệu.
Benjamin Abt

FYI: Trình giới thiệu URL không đáng tin cậy.
Thắng

Câu trả lời:


153

Bạn đã gần tới. Các StringValueslớp học chỉ là một loại ASP.NET sử dụng để đại diện cho một cách hiệu quả chuỗi trong khuôn khổ. Đặc biệt là ở HttpContextđối tượng. Bạn chỉ có thể gọi ToString()nó để chuyển nó thành chuỗi:

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

1
Bạn có coi đây là một cách làm đáng tin cậy không? Có cách nào thay thế không?
Kemal Tezer Dilsiz

4
Nó là đáng tin cậy về mặt truy cập tài sản từ các tiêu đề yêu cầu được gửi bởi khách hàng. Tuy nhiên, tôi sẽ không coi giá trị của tiêu đề liên kết giới thiệu được gửi bởi khách hàng là đáng tin cậy vì nó rất dễ nóng nảy.
Henk Mollema

70
Đối với những người tò mò liệu Referer có bị viết sai chính tả trong anwer hay không, thì không. Mặc dù Người giới thiệu là chính tả chính xác, họ đã viết sai chính tả trong đặc tả HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank

1
Bạn có thể tìm thấy tất cả những gì liên quan đến việc di chuyển các trình xử lý HTTP và mô-đun sang ASP.net Core tại: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH

1
@FrankRem Knot rằng Aye'm ah speling rất kỳ quặc, nhưng điều đó khá buồn cười. Đã xác định được thủ phạm viết sai chính tả chưa?
Michael Tranchida


9

Đây là cách tôi có liên kết giới thiệu url: -

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


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

Làm thế nào để truy cập Ngữ cảnh trong trang dao cạo như bạn đã hiển thị trong ví dụ đó? Tôi đã thêm mã nhưng Ngữ cảnh vẫn chưa được xác định.
ZedZip

Tôi đang lấy nó từ lớp WebViewPage của System.Web.Mvc
Intesar Alam

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

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

gần giống với câu trả lời được chấp nhận mà không có chuỗi ma thuật


Nhưng có yêu cầu một Nugetgói ( Microsoft.AspNetCore.Server.Kestrel) ... cũng đã được thử nghiệm này để hoạt động IISExpress? SSL? Vân vân.?
Serj Sagan

1
@SerjSagan theo quan điểm của tôi, độ tin cậy của mã được cung cấp bởi an toàn kiểu (liên quan đến chuỗi ma thuật cho các giải pháp khác) phần lớn vượt trội hơn nuget bổ sung, đối với lưu trữ, vì nó dựa vào kestrel nên nó sẽ hoạt động ở tất cả các chế độ lưu trữ. SSL không được thử nghiệm nhưng nó không nên tạo sự khác biệt
Souhaieb Besbes

1

Điều này hoạt động (được thử nghiệm trong .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestlà thuộc tính của cả hai ControllerBase(và do đó Controllercũng vậy) và HttpContext, vì vậy bạn có thể lấy nó từ một trong hai.

Ví dụ: để chuyển hướng đến trang giới thiệu từ một hành động của bộ điều khiển, chỉ cần thực hiện như sau:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.