在常规ASP.NET中,您可以在视图中执行此操作以确定当前请求是否来自localhost:
{{1}}
但是我无法在ASP.NET 6 / Core /中找到类似的内容。无论它是什么意思。
答案 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
。
其他工作解决方案仅检查可能不合适的第一个环回地址(::1
或127.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.RemoteIpAddress
和ControllerContext.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)
你可以使用这个:
if (Request.Host.Host == "localhost") {// do something }
答案 6 :(得分:0)
晚些时候参加聚会,但是如果我想在.Net core 2.2+中的剃刀视图中检查IsLocal,请执行以下操作:
@if (Context.Request.Host.Value.StartsWith("localhost"))
{
//do local stuff
}