C# 确定请求是否来自本地网络(intranet)

C# 确定请求是否来自本地网络(intranet),c#,asp.net,sharepoint,iis,asp-classic,C#,Asp.net,Sharepoint,Iis,Asp Classic,我需要使用客户端或服务器端确定请求是否来自Internet或Intranet 我试图解决的问题是:我们的网站可以通过internet和intranet访问。intranet用户(公司内部的用户)无权访问internet。我们使用的是Google Anylitics,当intranet用户访问该页面时,该页面需要很长时间才能上传,因为它试图下载从Google生成的(ga)JavaScript文件 有解决方案吗?使用该属性确定请求是来自公用网络还是专用网络您可以检查用户的ip地址。专用ip4地址始终

我需要使用客户端或服务器端确定请求是否来自Internet或Intranet

我试图解决的问题是:我们的网站可以通过internet和intranet访问。intranet用户(公司内部的用户)无权访问internet。我们使用的是Google Anylitics,当intranet用户访问该页面时,该页面需要很长时间才能上传,因为它试图下载从Google生成的(ga)JavaScript文件


有解决方案吗?

使用该属性确定请求是来自公用网络还是专用网络

您可以检查用户的ip地址。专用ip4地址始终以10、172或192.*开头。。。更多关于私人网络的信息

你也可以

*****************更新-请阅读*************************************

正如@igor turman正确指出的,只有“172”和“192”地址范围中的一部分被指定为私人使用。 其余以172和192开头的ip地址是公共的。

以下是用于检查专用IP地址的正则表达式:

(^192\.168\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)|(^172\.([1][6-9]|[2][0-9]|[3][0-1])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)|(^10\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)

您可以在regexpal.com上测试此正则表达式。

这是我执行ip检查的方式:

string ipString = System.Web.HttpContext.Current.Request.UserHostAddress;
byte[] ipBytes = System.Net.IPAddress.Parse(ipString).GetAddressBytes();
int ip = System.BitConverter.ToInt32(ipBytes, 0);

// your network ip range
string ipStringFrom = "192.168.1.0";
byte[] ipBytesFrom = System.Net.IPAddress.Parse(ipStringFrom).GetAddressBytes();
int ipFrom = System.BitConverter.ToInt32(ipBytesFrom, 0);

string ipStringTo = "192.168.1.255";
byte[] ipBytesTo= System.Net.IPAddress.Parse(ipStringTo).GetAddressBytes();
int ipTo = System.BitConverter.ToInt32(ipBytesFrom, 0);

bool clientIsOnLAN = ipFrom >= ip && ip <= ipTo;
巫术:
没有一个答案是好的或正确的。
您可以将IP(仅IPv4-IPv6为UInt128)转换为UInt32值,然后检查请求的IP是否在专用IP范围内:

e、 g.如果不是内部网,您可以使用它将cookie设置为“安全”

For Each thisCookie As System.Web.HttpCookie In response.Cookies
    thisCookie.HttpOnly = True

    Dim ipString As String = System.Web.HttpContext.Current.Request.UserHostAddress

    If Not IPv4Info.IsPrivateIp(ipString) Then
        thisCookie.Secure = True
    End If

Next thisCookie
VB.NET类,可以将其转换为C#yourself()

公共类IPv4Info
私有类IPV4范围
公共范围起始为UInt32
公共范围结束为UInt32
末级
' https://en.wikipedia.org/wiki/Private_network
' https://tools.ietf.org/html/rfc1918
'192.168.0.0-192.168.255.255(65536个IP地址)
'172.16.0.0-172.31.255.255(1048576 IP地址)
'10.0.0.0-10.255.255.255(16777216 IP地址)
私有共享Rng127,作为IPv4Range=New IPv4Range(),带有{.RangeStart=GetIpNum(“127.0.0.0”),.RangeEnd=GetIpNum(“127.255.255.255”)}
私有共享Rng192,作为IPv4Range=New IPv4Range(),带有{.RangeStart=GetIpNum(“192.168.0.0”),.RangeEnd=GetIpNum(“192.168.255.255”)}'CIDR:192.168.0.0/16(255.255.0.0)
私有共享Rng172,作为IPv4Range=New IPv4Range(),带有{.RangeStart=GetIpNum(“172.16.0.0”),.RangeEnd=GetIpNum(“172.31.255.255”)}'CIDR:172.16.0.0/12(255.240.0.0)
私有共享Rng10作为IPv4Range=New IPv4Range(),带有{.RangeStart=GetIpNum(“10.0.0.0”),.RangeEnd=GetIpNum(“10.255.255.255”)}'CIDR:10.0.0.0/8(255.0.0.0)
' http://stackoverflow.com/questions/36831/how-do-you-parse-an-ip-address-string-to-a-uint-value-in-c
作为UInt32的公共共享函数GetIpNum(ipString作为String)
Dim ipAddress__1作为System.Net.ipAddress=System.Net.ipAddress.Parse(“some.ip.address”)
Dim ipBytes As Byte()=ipAddress\uuuu 1.GetAddressBytes()

Dim ip As UInt32=电路(ipBytes(0))不正确。只有172.*和192.*范围的部分被指定为私有范围:@autonomatt,你应该更新或删除你的答案,因为人们被它误导了,如果他们只是信任你的答案而不研究细节,这可能会带来很大的麻烦。你可以共享类似的IPV6正则表达式吗?不清楚更新的正则表达式是否正确处理了172.*和192.*范围内的公共IP地址。如果不可能,则无。您正在使用[0-2][0-5][0-5]测试3位输入(100-255)。对于包含大于5的数字的3位数字,此操作失败,例如189。此示例未通过正确专用网络范围(例如192.168.0.0、10.0.0.0等)低端的单元测试。因此,它是无效的。此外,它在“To”块中有typo-ipBytesFrom重复。请检查此解决方案:。如果用户连接到VPN,它将执行此任务并通过单元测试验证?
For Each thisCookie As System.Web.HttpCookie In response.Cookies
    thisCookie.HttpOnly = True

    Dim ipString As String = System.Web.HttpContext.Current.Request.UserHostAddress

    If Not IPv4Info.IsPrivateIp(ipString) Then
        thisCookie.Secure = True
    End If

Next thisCookie
Public Class IPv4Info


    Private Class IPv4Range
        Public RangeStart As UInt32
        Public RangeEnd As UInt32
    End Class


    ' https://en.wikipedia.org/wiki/Private_network
    ' https://tools.ietf.org/html/rfc1918
    ' 192.168.0.0 - 192.168.255.255 (65,536 IP addresses)
    ' 172.16.0.0 - 172.31.255.255 (1,048,576 IP addresses)
    ' 10.0.0.0 - 10.255.255.255 (16,777,216 IP addresses)

    Private Shared Rng127 As IPv4Range = New IPv4Range() With {.RangeStart = GetIpNum("127.0.0.0"), .RangeEnd = GetIpNum("127.255.255.255")}
    Private Shared Rng192 As IPv4Range = New IPv4Range() With {.RangeStart = GetIpNum("192.168.0.0"), .RangeEnd = GetIpNum("192.168.255.255")} ' CIDR: 192.168.0.0/16 (255.255.0.0) 
    Private Shared Rng172 As IPv4Range = New IPv4Range() With {.RangeStart = GetIpNum("172.16.0.0"), .RangeEnd = GetIpNum("172.31.255.255")} ' CIDR: 172.16.0.0/12 (255.240.0.0)
    Private Shared Rng10 As IPv4Range = New IPv4Range() With {.RangeStart = GetIpNum("10.0.0.0"), .RangeEnd = GetIpNum("10.255.255.255")} ' CIDR: 10.0.0.0/8 (255.0.0.0)


    ' http://stackoverflow.com/questions/36831/how-do-you-parse-an-ip-address-string-to-a-uint-value-in-c
    Public Shared Function GetIpNum(ipString As String) As UInt32
        Dim ipAddress__1 As System.Net.IPAddress = System.Net.IPAddress.Parse("some.ip.address")
        Dim ipBytes As Byte() = ipAddress__1.GetAddressBytes()
        Dim ip As UInt32 = CUInt(ipBytes(0)) << 24
        ip += CUInt(ipBytes(1)) << 16
        ip += CUInt(ipBytes(2)) << 8
        ip += CUInt(ipBytes(3))

        Return ip
    End Function


    Public Shared Function isIn127(ipString As String) As Boolean
        Dim ip As UInt32 = GetIpNum(ipString)
        Return isIn127(ip)
    End Function


    Public Shared Function isIn127(x As UInt32) As Boolean
        If x >= Rng127.RangeStart AndAlso x <= Rng127.RangeEnd Then
            Return True
        End If

        Return False
    End Function



    Public Shared Function isIn192(ipString As String) As Boolean
        Dim ip As UInt32 = GetIpNum(ipString)
        Return isIn192(ip)
    End Function


    Public Shared Function isIn192(x As UInt32) As Boolean
        If x >= Rng192.RangeStart AndAlso x <= Rng192.RangeEnd Then
            Return True
        End If

        Return False
    End Function


    Public Shared Function isIn172(ipString As String) As Boolean
        Dim ip As UInt32 = GetIpNum(ipString)
        Return isIn172(ip)
    End Function


    Public Shared Function isIn172(x As UInt32) As Boolean
        If x >= Rng172.RangeStart AndAlso x <= Rng172.RangeEnd Then
            Return True
        End If

        Return False
    End Function


    Public Shared Function isIn10(ipString As String) As Boolean
        Dim ip As UInt32 = GetIpNum(ipString)
        Return isIn10(ip)
    End Function


    Public Shared Function isIn10(x As UInt32) As Boolean
        If x >= Rng10.RangeStart AndAlso x <= Rng10.RangeEnd Then
            Return True
        End If

        Return False
    End Function

    ' string ipString = System.Web.HttpContext.Current.Request.UserHostAddress;
    Public Shared Function IsPrivateIp(ipString As String) As Boolean
        Dim ip As UInt32 = GetIpNum(ipString)

        Return IsPrivateIp(ip)
    End Function


    Public Shared Function IsPrivateIp(ip As UInt32) As Boolean

        If isIn127(ip) OrElse isIn192(ip) OrElse isIn172(ip) OrElse isIn10(ip) Then
            Return True
        End If

        Return False
    End Function


End Class