【问题标题】:Application_BeginRequest UsageApplication_BeginRequest 用法
【发布时间】:2017-01-02 18:25:30
【问题描述】:

我们正在我们的 ASP.NET MVC 项目中尝试一些登录操作。我们的目标是:“如果用户的 IP 不是来自我们的 Intranet,则将他/她重定向到登录页面。否则,只需转到我们的索引页面。我们编写了一些代码,但我们处于循环中。

GLOBAL.ASAX

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var request = ((System.Web.HttpApplication) sender).Request;

        string ip1 = request.UserHostAddress;
        string shortLocalIP;
        if (ip1 != null && ip1.Contains("."))
        {
            string[] ipValues = ip1.Split('.');
            shortLocalIP = ipValues[0] +"."+ipValues[1];
        }
        else
        {
            shortLocalIP = "192.168";
        }

        //var ip2 = request.ServerVariables["LOCAL_ADDR"];
        //var ip3 = request.ServerVariables["SERVER_ADDR"];

        if (shortLocalIP != LOCALIP)
        {
            if ("/Login/User".Equals(request.RawUrl, StringComparison.InvariantCultureIgnoreCase))
            {                   
                    return;                                  
            }

            Response.Clear();            
            Response.Redirect("/Login/User");             
            Response.End();       
        }
    }

登录控制器

 public class LoginController : Controller
{
    // GET: Login
    public ActionResult User()
    {         
        return View();
    }

    public ActionResult checkAuthentication(FormCollection collection)
    {
        bool isAuthenticated = new LdapServiceManager().isAuthenticated(collection);
        if (isAuthenticated)
        {
            Response.Redirect("Home/Index");
        }
        else
        {
            Response.Redirect("/Login/User");
        }
        return null;
    }
}

登录 CSHTML

 <form class="login-form" action="/Login/checkAuthentication" method="post" novalidate="novalidate">

Application_BeginRequest 每次我们按下某个按钮或其他东西时都会触发。但我们只希望在开始时进行这些操作。谢谢...

我们应该在 GLOBAL.ASAX 中使用 SESSION START 吗?

【问题讨论】:

  • 你是什么意思“开始”?该用户第一次打开您的应用程序?但是,什么是“这个用户”?来自这个特定 IP 的用户?那么你需要检查每个请求的 IP ......这正是你正在做的事情!
  • 我的意思是,如果您打开我的页面,我们会检查您的 IP。如果您的 ip 来自我们的网络,请转到 index.html。如果您的 ip 不是来自我们的网络,请将页面定向到 loginPage。在 loginPage 中,我们需要来自用户的输入。当用户按下登录按钮时,由于 application_beginRequest 再次重定向 loginPage

标签: c# asp.net asp.net-mvc


【解决方案1】:

您可以为此使用ActionFilter。为自定义过滤器创建一个类,如下所示 -

public class IntranetAction : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        bool isIPAddressValid = false;//TODO: Check the IP validity here
        if (isIPAddressValid)
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Account", //TODO - Edit as per you controller
                action = "Login"        //and Action
            }));
        }

        base.OnActionExecuting(filterContext);
    }
}

并且只需像这样在您的控制器ActionMethod 上使用它 -

    [IntranetAction]
    public ActionResult Index()
    {
        return View();
    }

建议阅读一篇好文章以开始使用自定义过滤器 - http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs

【讨论】:

  • 我无法在我的函数之上编写 IntranetAction
  • @Berkin IntranetAction 是我们创建的自定义过滤器。确保名称正确并且您引用了正确的命名空间。
【解决方案2】:

您可以将 ActionFilter 用于 MVC。这是操作的示例代码。

public class IpControlAttribute : ActionFilterAttribute {
    private const string LOCALIP = "";

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        var request = filterContext.RequestContext.HttpContext.Request;

        string ip1 = request.UserHostAddress;
        string shortLocalIP;
        if (ip1 != null && ip1.Contains(".")) {
            string[] ipValues = ip1.Split('.');
            shortLocalIP = ipValues[0] + "." + ipValues[1];
        } else {
            shortLocalIP = "192.168";
        }

        //var ip2 = request.ServerVariables["LOCAL_ADDR"];
        //var ip3 = request.ServerVariables["SERVER_ADDR"];

        if (shortLocalIP != LOCALIP) {
            if ("/Login/User".Equals(request.RawUrl, StringComparison.InvariantCultureIgnoreCase)) {
                return;
            }

            filterContext.Result = new RedirectResult("/Account/Login");
        }
    }
}

然后你需要将它作为全局过滤器添加到 FilterConfig.cs

filters.Add(new IpCheckAttribute());

【讨论】:

  • 感谢您的帮助,Teşekkürler :) 我在 App_Start 文件夹中创建了一个名为 FilterConfig.cs 的类。但我不明白最后一部分。我应该在哪里写 filters.add 部分?在 global.asax -> Application_Start 函数中?
  • 请记住,将其添加为全局过滤器将使其执行所有操作。小心点。
  • 没有在 mvc 应用程序中有一个名为 App_Start 的文件夹。在其下有 FilterConfig 文件。在那里添加该代码。另一方面,@Yogi 提到它将用于每个动作。如果要指定特定操作,则需要将其写入控制器或操作,例如 [IpCheck] public class HomeController:Controller{}
  • 回答有点晚了!
【解决方案3】:

Application_BeginRequest 将在向您的服务器发出的每个请求上调用。如果您只想对某些操作执行某些逻辑,请使用ActionFilters

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2010-11-12
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多