使网站只能从给定的ip使用
本文关键字:ip 使用 网站 | 更新日期: 2023-09-27 17:58:09
是否可以将我的entaire web应用程序设置为仅从给定的ip地址可用?我可以使用global.asax或其他东西将代码只放在一个地方并可以自由删除吗?
感谢任何提示
对我来说,最好的解决方案是在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_HOST和REMOTE_ADDR总是只返回IP给我,可能是因为我需要一些额外的设置来获取主机参数上的地址