除了使用基页类之外,有没有办法在asp.net 4.5 中为.aspx或.cshtml页面的每个请求编写一些代码。这是一个非常庞大的项目,对所有页面进行更改以使用基页是一场噩梦。此外,我不确定如何为cshtml页面做这件事,因为他们没有班级。
我们可以使用 Application_BeginRequest 并仅定位aspx和cshtml文件,因为网站是以集成模式运行的。?
基本上,我必须检查访问该网站的用户是否具有针对数据库的特定IP地址,如果是,则允许访问,否则重定向。
我们正在使用IIS8和ASP.Net 4.5以及ASP.Net Razor网页
答案 0 :(得分:1)
此外,我不确定如何对cshtml页面进行此操作,因为它们没有类。
您可以放置一个_ViewStart.cshtml
文件,其内容将在每个请求中执行。
或者你可以写一个custom Http Module
:
public class MyModule: IHttpModule
{
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(OnBeginRequest);
}
public void Dispose()
{
}
public void OnBeginRequest(object s, EventArgs e)
{
// this code here's gonna get executed on each request
}
}
然后只需在web.config中注册此模块:
<system.webServer>
<modules>
<add name="MyModule" type="SomeNamespace.MyModule, SomeAssembly" />
</modules>
...
</system.webServer>
或者如果您在经典模式下运行:
<system.web>
<httpModules>
<add name="MyModule" type="SomeNamespace.MyModule, SomeAssembly" />
</httpModules>
</system.web>
基本上,我必须检查访问该网站的用户是否有 针对数据库的特定IP地址,如果是,则允许访问 否则重定向。
在OnBeginRequest
方法中,您可以获得当前用户IP:
public void OnBeginRequest(object sender, EventArgs e)
{
var app = sender as HttpApplication;
var request = app.Context.Request;
string ip = request.UserHostAddress;
// do your checks against the database
}
答案 1 :(得分:1)
Asp.net MVC过滤器专为此目的而设计。
您可以像这样实现ActionFilterAttribute(可能将此新类放在您的webapp解决方案的Filters文件夹中):
public class IpFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string ip = filterContext.HttpContext.Request.UserHostAddress;
if(!testIp(ip))
{
if (true /* You want to use a route name*/)
filterContext.Result = new RedirectToRouteResult("badIpRouteName");
else /* you want an url */
filterContext.Result = new RedirectResult("~/badIpController/badIpAction");
}
base.OnActionExecuting(filterContext);
}
private bool testIp(string inputIp)
{
return true /* do you ip test here */;
}
}
然后你必须装饰任何会用IpFilter执行ipcheck的动作,如下所示:
[IpFilter]
public ActionResult AnyActionWhichNeedsGoodIp()
{
/* do stuff */
}