在ASP.NET Core中,如何检查请求是否是本地的?

时间:2016-02-06 11:43:04

标签: c# asp.net-core

在常规ASP.NET中,您可以在视图中执行此操作以确定当前请求是否来自localhost:

{{1}}

但是我无法在ASP.NET 6 / Core /中找到类似的内容。无论它是什么意思。

7 个答案:

答案 0 :(得分:18)

更新:ASP.NET Core 2.0有一个名为Url.IsLocalUrl 的方法(请参阅此Microsoft Docs)。

认为这段代码可行,但我无法完全测试

var callingUrl = Request.Headers["Referer"].ToString();
var isLocal = Url.IsLocalUrl(callingUrl);

但请参阅Will Dean关于此方法的评论:

  

任何考虑使用“更新”版本检查Referrer标头的人都应该记住,标头非常容易欺骗,其程度不适用于环回IP地址。

原始解决方案

我遇到了这个寻找解决方案,以了解请求是否是本地的。不幸的是,ASP.NET 1.1.0版在连接上没有IsLocal方法。我在一个名为Strathweb的网站上找到了一个解决方案,但这也是过时的。

我已经创建了自己的IsLocal扩展程序,它似乎可行,但我不能说我已经在所有情况下对其进行了测试,但欢迎您尝试使用它。

public static class IsLocalExtension
{
    private const string NullIpAddress = "::1";

    public static bool IsLocal(this HttpRequest req)
    {
        var connection = req.HttpContext.Connection;
        if (connection.RemoteIpAddress.IsSet())
        {
            //We have a remote address set up
            return connection.LocalIpAddress.IsSet() 
                  //Is local is same as remote, then we are local
                ? connection.RemoteIpAddress.Equals(connection.LocalIpAddress) 
                  //else we are remote if the remote IP address is not a loopback address
                : IPAddress.IsLoopback(connection.RemoteIpAddress);
        }

        return true;
    }

    private static bool IsSet(this IPAddress address)
    {
        return address != null && address.ToString() != NullIpAddress;
    }
}

您可以使用Request属性(即

)在控制器操作中调用它
 public IActionResult YourAction()
 {
     var isLocal = Request.IsLocal();
     //... your code here
 }

我希望能帮助别人。

答案 1 :(得分:6)

在撰写本文时,.NET Core已经缺少HttpContext.Connection.IsLocal

其他工作解决方案仅检查可能不合适的第一个环回地址(::1127.0.0.1)。

我发现以下解决方案很有用:

using Microsoft.AspNetCore.Http;
using System.Net;

namespace ApiHelpers.Filters
{
    public static class HttpContextFilters
    {
        public static bool IsLocalRequest(HttpContext context)
        {
            if (context.Connection.RemoteIpAddress.Equals(context.Connection.LocalIpAddress))
            {
                return true;
            }
            if (IPAddress.IsLoopback(context.Connection.RemoteIpAddress))
            {
                return true;
            }
            return false;
        }
    }
}

示例用例:

app.UseWhen(HttpContextFilters.IsLocalRequest, configuration => configuration.UseElmPage());

答案 2 :(得分:4)

现在它的

HttpContext.Connection.IsLocal

如果您需要检查控制器外部,那么您依赖IHttpContextAccessor来访问它。

根据评论更新:

HttpContext在视图

中本质上可用
@if (Context.Connection.IsLocal)
{

}

答案 3 :(得分:1)

我还要提一下,将以下子句添加到自定义IsLocal()支票的末尾可能很有用

if (connection.RemoteIpAddress == null && connection.LocalIpAddress == null)
{
    return true;
}

这将考虑使用Microsoft.AspNetCore.TestHost运行站点的情况,并且该站点在内存中完全在本地运行而没有实际的TCP / IP连接。

答案 4 :(得分:1)

以上都不对我有用。

Url.IsLocalUrl的工作原理截然不同,我发现它有点无用:

例如,以下URL被视为本地URL:

  /Views/Default/Index.html
  ~/Index.html

以下网址不是本地网址:

  ../Index.html
  http://www.contoso.com/
  http://localhost/Index.html

HttpContext.Connection.IsLocal在.Net Core 2.2中不存在

比较ControllerContext.HttpContext.Connection.RemoteIpAddressControllerContext.HttpContext.Connection.LocalIpAddress在我的测试中也不起作用,因为对于远程ip,我得到“ :: 1”,对于本地ip,我得到“ 127.0.0.1”。

最后,我用了这块:

IPAddress addr = System.Net.IPAddress.Parse( HttpContext.Connection.RemoteIpAddress.ToString() );
if (System.Net.IPAddress.IsLoopback(addr) )
{
    //do something
}

答案 5 :(得分:1)

ASP.NET Core 3.1 的更新

你可以使用这个:

if (Request.Host.Host == "localhost") {// do something }

答案 6 :(得分:0)

晚些时候参加聚会,但是如果我想在.Net core 2.2+中的剃刀视图中检查IsLocal,请执行以下操作:

@if (Context.Request.Host.Value.StartsWith("localhost"))
{
    //do local stuff
}