如何在ASP.NET Core MVC中获得“网址引荐来源网址”?


96

我正在尝试将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不想让您看到引荐来源网址的搜索文字。
本杰明·阿卜特

仅供参考:URL Referer不可靠。
赢得

Answers:


147

您快到了。本StringValues类只是一个类型ASP.NET应用高效地表示在框架中的字符串。特别是在HttpContext物体上。您只需调用ToString()它即可将其转换为字符串:

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

您是否认为这是一种可靠的方法?还有其他方法吗?
凯末尔·泰泽·迪西兹

4
就从客户端发送的请求标头访问属性而言,这是可靠的。但是,我认为客户端发送的引荐来源标头的不可靠,因为它很容易调整。
Henk Mollema'8

66
对于那些好奇如果引号中拼写错误的人,事实并非如此。尽管Referrer是正确的拼写,但他们在HTTP规范english.stackexchange.com/questions/42630/referer-or-referrer/中
Frank Rem

1
您可以在以下位置找到所有与HTTP处理程序和模块到ASP.net Core的迁移有关的文档
AlexGH

1
@FrankRem知道Aye's啊,说的太好了,但这很有趣。拼写错误的罪魁祸首是否被剔除?
Michael Tranchida


8

这是我获得网址引荐来源网址的方式:-

@{
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)...是否也已经过测试才能工作IISExpressSSL?等等。?
Serj Sagan

1
@SerjSagan在我看来,类型安全(与其他解决方案的魔术字符串相对)所提供的代码可信度在很大程度上超过了其他托管对象,因为它依赖于茶est,它应该在所有托管模式下都可以工作。SSL未经测试,但不应有所作为
Souhaieb Besbes

0

这有效(在.NET Core 3.1中测试):

Request.GetTypedHeaders().Referer

Request是两者的性质BaseControllerHttpContext,这样你就可以从任一得到它。

例如,要从控制器操作重定向到引荐页,只需执行以下操作:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.