使网站只能从给定的ip使用

本文关键字:ip 使用 网站 | 更新日期: 2023-09-27 17:58:09

是否可以将我的entaire web应用程序设置为仅从给定的ip地址可用?我可以使用global.asax或其他东西将代码只放在一个地方并可以自由删除吗?

感谢任何提示

使网站只能从给定的ip使用

对我来说,最好的解决方案是在IIS中过滤IP
我已经做了,而且效果很好。。。并且您不必更改一行代码。

如果您没有访问IIS的权限,那么您可以按照Scott Hanselman的建议创建一个自定义HttpModule:

namespace YourModuleNameHere
{
    public class IPBlackList : IHttpModule
    {
        private EventHandler onBeginRequest;
        public IPBlackList()
        {
            onBeginRequest = new EventHandler(this.HandleBeginRequest);
        }
        void IHttpModule.Dispose()
        {
        }
        void IHttpModule.Init(HttpApplication context)
        {
            context.BeginRequest += onBeginRequest;
        }
        const string BLOCKEDIPSKEY = "blockedips";
        const string BLOCKEDIPSFILE = "SiteConfig/blockedips.config";
        public static StringDictionary GetBlockedIPs(HttpContext context)
        {
            StringDictionary ips = (StringDictionary)context.Cache[BLOCKEDIPSKEY];
            if (ips == null)
            {
                ips = GetBlockedIPs(GetBlockedIPsFilePathFromCurrentContext(context));
                context.Cache.Insert(BLOCKEDIPSKEY, ips, new CacheDependency(GetBlockedIPsFilePathFromCurrentContext(context)));
            }
            return ips;
        }
        private static string BlockedIPFileName = null;
        private static object blockedIPFileNameObject = new object();
        public static string GetBlockedIPsFilePathFromCurrentContext(HttpContext context)
        {
            if (BlockedIPFileName != null)
                return BlockedIPFileName;
            lock (blockedIPFileNameObject)
            {
                if (BlockedIPFileName == null)
                {
                    BlockedIPFileName = context.Server.MapPath(BLOCKEDIPSFILE);
                }
            }
            return BlockedIPFileName;
        }
        public static StringDictionary GetBlockedIPs(string configPath)
        {
            StringDictionary retval = new StringDictionary();
            using (StreamReader sr = new StreamReader(configPath))
            {
                String line;
                while ((line = sr.ReadLine()) != null)
                {
                    line = line.Trim();
                    if (line.Length != 0)
                    {
                        retval.Add(line, null);
                    }
                }
            }
            return retval;
        }
        private void HandleBeginRequest(object sender, EventArgs evargs)
        {
            HttpApplication app = sender as HttpApplication;
            if (app != null)
            {
                string IPAddr = app.Context.Request.ServerVariables["REMOTE_ADDR"];
                if (IPAddr == null || IPAddr.Length == 0)
                {
                    return;
                }
                StringDictionary badIPs = GetBlockedIPs(app.Context);
                if (badIPs != null && badIPs.ContainsKey(IPAddr))
                {
                    app.Context.Response.StatusCode = 404;
                    app.Context.Response.SuppressContent = true;
                    app.Context.Response.End();
                    return;
                }
            }
        }
    }
}

并在您的web.config:中使用

<system.web>
    <httpModules>
        <add type = "YourModuleNameHere.IPBlackList, YourAssemblyNameHere" name="IPBlackList" />
   </httpModules>
</system.web>

是的,这是可能的。您可以从访问和阻止的位置获取系统IP地址。

请求.参数["REMOTE_ADDR"]

你可以看到这个链接的详细信息

通过IP地址限制访问的最佳方式?

您可以为此创建一个HTTP模块,然后在web.config中注册它,以防您无法访问IIS。

HttpModule结构应如下所示;

namespace MyApp {
    public class MyModule : IHttpModule {
        public void Init(HttpApplication context) {
        }
        public void Dispose() { 
        }
    }
}

在Init事件中实现逻辑后,需要在web.config文件中注册模块,以便在每个请求中执行它;

<configuration>
   <system.web>
      <httpModules>
         <add name="MyModule" type="MyApp.MyModule, MyApp" />
      </httpModules>
   </system.web>
</configuration>

如果您处于IIS 7或7.5的集成模式,则应在web.config 的<system.webServer>标记内进行此注册

  protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string ip = Request.Params["REMOTE_ADDR"].ToString();
        if (ip == "your-ip")
        {
            // no action
        }
        else
        {
            Response.Redirect("url");  
        }
    }

如果您无法访问iis,或者需要从asp.net控制它,您可以在BeginRequest上检查REMOTE_HOST或REMOTE_ADDR

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    HttpApplication app = (HttpApplication)sender;
    if(app.Request.ServerVariables["REMOTE_ADDR"] != "1.1.1.1")
    {
        HttpContext.Current.Response.End();
        return
    }
}

但你也必须考虑Ip欺骗

Ps:REMOTE_HOSTREMOTE_ADDR总是只返回IP给我,可能是因为我需要一些额外的设置来获取主机参数上的地址