ASP.NET Core MVCでURLリファラーを取得するにはどうすればよいですか?


96

ASP.NET MVC Webフォームを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を返します。これを使用する必要があるかどうか、またはこの状況に対する他の解決策があるかどうかはわかりません。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 2016

参考:URLリファラーは信頼できません。
2016

回答:


147

あと少しです。このStringValuesクラスは、フレームワークで文字列を効率的に表現するためにASP.NETが使用するタイプです。特にHttpContextオブジェクトで。ToString()それを呼び出すだけで文字列に変換できます:

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

これは信頼できる方法だと思いますか?別の方法はありますか?
Kemal Tezer Dilsiz 16

4
クライアントから送信されるリクエストヘッダーからプロパティにアクセスするという点では信頼性があります。ただし、クライアントが送信するリファラーヘッダーのは、調整が非常に簡単であるため、信頼できるとは見なしません。
Henk Mollema

66
リファラーの回答のつづりにミススペルがあるかどうかを知りたい場合は、そうではありません。リファラーが正しいスペルですが、彼らは、HTTP仕様でスペルミスをしたenglish.stackexchange.com/questions/42630/referer-or-referrer/...
フランク・レム

1
HTTPハンドラーおよびモジュールのASP.net Coreへの移行に関するすべての情報は、docs.microsoft.com
us

1
@FrankRem結び目は、Ayeがahを鋭く見ていることですが、それはかなり面白いです。スペルを間違えた犯人は連れ出されましたか?
Michael Tranchida、


8

これが私が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 2018

1
@SerjSagan私の意見では、タイプセーフティによって提供されるコードの信頼性(他のソリューションのマジックストリングとは対照的に)は、ホスティングに関しては、追加のnugetを大幅に上回ります。SSLはテストされていませんが、違いはありません
Souhaieb Besbes 2018

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.