限制访问的最佳方法是什么?通过IP地址?

20
对于一个ASP.NET C#应用程序,我们需要基于IP地址限制访问。如何最好地实现这一点?

类似的问题已经有你所寻找的答案了...https://dev59.com/AnE95IYBdhLWcg3wXs2R#6108168 - Nathan Hartley
3个回答

19

一种方法是使用 HttpModule

链接如下(以防失效):

/// <summary>
/// HTTP module to restrict access by IP address
/// </summary>

public class SecurityHttpModule : IHttpModule
{
 public SecurityHttpModule() { }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(Application_BeginRequest);
    }

    private void Application_BeginRequest(object source, EventArgs e)
    {
        HttpContext context = ((HttpApplication)source).Context;
        string ipAddress = context.Request.UserHostAddress;
        if (!IsValidIpAddress(ipAddress))
        {
            context.Response.StatusCode = 403;  // (Forbidden)

        }
    }

    private bool IsValidIpAddress(string ipAddress)
    {
        return (ipAddress == "127.0.0.1");
    }

    public void Dispose() { /* clean up */ }
}

一旦HTTP Module类被创建,您需要在web.config文件的httpModules部分中注册它,就像这样:

<configuration>
    <system.web>
        <httpModules>
            <add name="SecurityHttpModule" type="SecurityHttpModule"/>
        </httpModules>
    </system.web>
</configuration>

这将把模块添加到你的Web应用程序的ASP.NET请求管道中。


1
这是一个不错的方法,特别是如果您为允许的IP地址添加了配置节处理程序。 - Tom Anderson
2
IP范围怎么样? - zerohero
1
你写的那个 web.config 语法适用于 IIS6 / Cassini。对于 IIS 7 及以上版本,应该将其放在 <system.webServer> 而不是 <system.web> 和 <modules> 而不是 <httpModules> 下面。 - BornToCode

9

这里有一篇来自微软的文章,介绍了如何操作。


通过IP地址或域名设置文件夹安全性

Apache使用Allow和Deny指令来确定可以访问特定网站或文件夹的站点。然而,Apache提供自主访问控制;您必须拒绝所有站点并提供一个可以访问文件夹的站点或IP地址列表,或允许所有站点并仅拒绝那些您不想让其访问的站点。例如,如果您使用以下指令,则除非客户端计算机被识别为domain.com域的一部分,否则将拒绝所有客户端计算机的访问:

Deny from all
Allow from .domain.com

IIS也是同样的方式工作。所有客户端都会被明确地拒绝或授权访问,除了列出的那些。

为特定文件夹或网站定义访问控制

  • 以管理员身份登录Web服务器计算机。
  • 单击“开始”,指向“设置”,然后单击“控制面板”。
  • 双击“管理工具”,然后双击“Internet服务管理器”。
  • 如果您要限制整个站点的访问权限,请从左窗格中提供的不同服务站点列表中选择网站。

  • 如果您只想限制特定文件夹的访问权限,请单击要控制的文件夹。

  • 右键单击网站或文件夹,然后单击“属性”。
  • 单击“目录安全性”选项卡。
  • 如果您要将访问权限限制为特定一组站点但拒绝访问所有其他站点,请单击“拒绝访问”。
  • 如果您要默认授予所有客户端访问权限,但排除特定客户端列表,请单击“允许访问”。
  • 若要更新Except列表中的主机或域列表,请单击“添加”。
  • 若要将单个计算机添加到列表中,请单击“单个计算机”,在相应框中输入IP地址,然后单击“确定”。
  • 若要添加特定地址范围内的计算机范围,请单击“计算机组”,在相应框中输入网络的IP地址,输入要配置的网络范围的子网掩码,然后单击“确定”。
  • 若要按其标识域名添加计算机,请单击“域名”,然后在相应框中输入域名。
  • 单击“属性”,输入域名,然后单击“确定”。
  • 单击“确定”,然后单击“确定”。

注意: 如果您使用域名限制,服务器必须执行反向DNS查找来检查主机的注册域名。Microsoft建议您尽可能使用IP地址或网络范围。


1
如果您有一个小的静态地址列表需要阻止或允许,那么这很容易。如果您需要编程实现,请尝试@Mitch Wheat的答案。+1 - Michael Haren
1
这种方法还允许您添加IP范围,这也很好。 - Tom Anderson
我不会添加一个“允许来自domain.com的所有内容”,因为这会导致每个请求都进行IP查找。最好使用定义好的IP范围。 - NickG

8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接