ASP.NET Core MVC에서 URL 리퍼러를 얻으려면 어떻게하나요?


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"]

String 대신 StringValues를 반환합니다. 나는 이것을 사용 해야하는지 또는이 상황에 대한 다른 해결책이 있는지 확실하지 않습니다. 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과 같은 일부 사이트는 보안상의 이유로 참조자를 제공하지 않습니다. 구글의 관점에서 : 구글은 당신이 리퍼러의 일부가 될 검색 텍스트를 보는 것을 원하지 않습니다.
Benjamin Abt

참고 : URL Referer가 신뢰할 수 없습니다.
승리

답변:


152

거의 완료되었습니다. 이 StringValues클래스는 ASP.NET이 프레임 워크에서 문자열을 효율적으로 표현하는 데 사용하는 유형일뿐입니다. 특히 HttpContext개체에서. ToString()이를 호출 하여 문자열로 변환 할 수 있습니다 .

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

1
이것이 신뢰할 수있는 방법이라고 생각하십니까? 다른 방법이 있습니까?
Kemal Tezer Dilsiz

4
클라이언트가 보내는 요청 헤더에서 속성에 액세스하는 측면에서 신뢰할 수 있습니다. 그러나 조정 하기가 매우 쉽기 때문에 클라이언트가 보내는 참조 헤더 의 을 신뢰할 수 있다고 생각하지 않습니다 .
Henk Mollema

69
답글에서 Referer의 철자가 틀렸는 지 궁금한 사람들에게는 그렇지 않습니다. Referrer가 정확한 철자이지만, 그들은 HTTP 사양 english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank

1
당신은 모든 ASP.net 코어에 HTTP 처리기의 마이그레이션 및 모듈에 관한 정보를 찾을 수 있습니다 docs.microsoft.com/en-us/aspnet/core/migration/http-modules을
AlexGH

1
@FrankRem Knot that Aye'm speling geenious, but that 's pretty funny. 철자를 틀린 범인이 쫓겨 났습니까?
Michael Tranchida 2010 년


9

URL 리퍼러를 얻는 방법은 다음과 같습니다.

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


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

해당 예제에서 보여준 것처럼 면도기 페이지에서 컨텍스트에 액세스하는 방법은 무엇입니까? 코드를 추가했지만 컨텍스트가 정의되지 않았습니다.
ZedZip

System.Web.Mvc의 WebViewPage 클래스에서 가져옵니다
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 베스 베스

0

이것은 작동합니다 (.NET Core 3.1에서 테스트 됨).

Request.GetTypedHeaders().Referer

RequestBaseController및 의 속성이므로 둘 HttpContext중 하나에서 가져올 수 있습니다.

예를 들어 컨트롤러 작업에서 참조 페이지로 리디렉션하려면 다음과 같이하십시오.

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.