сделать сайт доступным только с данного ip - PullRequest
0 голосов
/ 02 июня 2011

Можно ли настроить мое веб-приложение entaire, доступное только с указанного IP-адреса?Могу ли я использовать global.asax или что-то еще, чтобы разместить код только в одном месте и иметь возможность свободно удалить его?

Спасибо за любые подсказки

Ответы [ 5 ]

2 голосов
/ 02 июня 2011

Лучшим решением для меня является фильтрация IP-адресов в IIS.
Я сделал это, и он работает правильно ... и вам не нужно менять ни одной строки кода.

Если у вас нет доступа к IIS, вы можете следовать предложению Скотта Хансельмана и создать пользовательский 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>
0 голосов
/ 02 июня 2011
  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");  
        }
    }
0 голосов
/ 02 июня 2011

вы можете создать модуль 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>

Если вы находитесь в интегрированном режиме IIS7 или 7.5, эта регистрация должна быть сделана внутри <system.webServer> тега web.config

0 голосов
/ 02 июня 2011

Если у вас нет доступа к 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_HOST и REMOTE_ADDR всегда возвращают мне только IP-адрес, вероятно, потому, что для получения адреса на параметре хоста необходима дополнительная настройка

0 голосов
/ 02 июня 2011

Да, это возможно.Вы можете получить системный IP-адрес, откуда он доступен и может заблокировать.

Request.Params ["REMOTE_ADDR"]

Подробную информацию можно найти по этой ссылке

Лучший способ ограничить доступ по IP-адресу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...