如何在 ASP.NET Core MVC 中获取 Url Referrer?

Posted

技术标签:

【中文标题】如何在 ASP.NET Core MVC 中获取 Url Referrer?【英文标题】:How can I get Url Referrer in ASP.NET Core MVC? 【发布时间】:2016-08-04 16:08:21 【问题描述】:

我正在尝试将 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;

如果有人能指引我正确的方向,我将不胜感激。

【问题讨论】:

出于安全原因,某些网站(如 Google)不会为您提供推荐人。从 Google 的角度来看:Google 不希望您看到作为引荐来源的搜索文本。 仅供参考:URL Referer 不可靠。 【参考方案1】:

你快到了。 StringValues 类只是 ASP.NET 用来在框架中有效表示字符串的一种类型。特别是在HttpContext 对象中。你可以直接调用 ToString() 将其转换为字符串:

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

【讨论】:

您认为这是一种可靠的方法吗?有没有其他方法? 从客户端发送的请求头中访问属性是可靠的。但是,我不认为客户端发送的引用标头的 value 是可靠的,因为它很容易调整。 对于那些好奇Referer是否在anwer中拼写错误的人来说,不是。虽然 Referrer 是正确的拼写,但他们在 HTTP 规范english.stackexchange.com/questions/42630/referer-or-referrer/… 中拼写错误 您可以在docs.microsoft.com/en-us/aspnet/core/migration/http-modules 中找到所有有关将 HTTP 处理程序和模块迁移到 ASP.net Core 的信息 @FrankRem Knot that Aye'm ah speling geenious,但这很有趣。拼错的罪魁祸首已经被查出来了吗?【参考方案2】:

从 asp.net core 2 开始使用 GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;

【讨论】:

这必须在 3 中删除 应该还在 3 @Snipe3000 docs.microsoft.com/en-us/dotnet/api/… 仍然存在,但您需要包含 using Microsoft.AspNetCore.Http; 以获取扩展方法。 我喜欢这个答案,因为这里的引用者是一个 Uri 对象而不是字符串,使用起来更方便【参考方案3】:

这可行(在 .NET Core 3.1 中测试):

Request.GetTypedHeaders().Referer

RequestControllerBase(因此也是 Controller)和 HttpContext 的属性,因此您可以从其中任何一个中获取它。

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

public IActionResult SomeAction()

    return Redirect(Request.GetTypedHeaders().Referer.ToString());

【讨论】:

仅供参考,您需要为此添加命名空间 - using Microsoft.AspNetCore.Http;【参考方案4】:

这是我获得 url referrer 的方式:-

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


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

【讨论】:

如何访问剃刀页面中的上下文,如您在该示例中所示?我已添加代码,但上下文未定义。 我是从 System.Web.Mvc 的 WebViewPage 类中获取的【参考方案5】:
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

几乎与没有魔法字符串的接受答案相同

【讨论】:

但确实需要 Nuget 包 (Microsoft.AspNetCore.Server.Kestrel)... 是否也已经过测试可以在 IISExpress 中使用? SSL?等等? @SerjSagan 在我看来,类型安全提供的代码一致性(与其他解决方案的魔术字符串相反)在很大程度上超过了额外的 nuget,因为它依赖于它应该工作的红隼所有托管模式。 SSL 没有经过测试,但应该不会有什么不同

以上是关于如何在 ASP.NET Core MVC 中获取 Url Referrer?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net core mvc 的控制器中获取自己的用户

如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户

如何从 HttpContext 获取 ASP.NET Core MVC 过滤器

如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量

当服务器位于 AWS ELB 之后时,ASP.NET Core MVC 应用程序如何获取客户端 IP 地址?

如何在 ASP.NET Core MVC 中请求和显示实时 Web api 数据?