使用HttpModule和Session进行身份验证,但是img src导致Session为null

时间:2018-10-15 10:31:18

标签: c# asp.net-mvc

我找到了一种通过IHttpModuleSession进行身份验证的方法,

context_PreRequestHandlerExecute 将在控制器中的操作之前拦截所有请求:

1. add AuthenticModule class

public class AuthenticModule : IHttpModule
{
    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }     

    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication ha = (HttpApplication)sender;
        string path = ha.Context.Request.Url.ToString();
        int n = path.ToLower().IndexOf("login");
        if (n == -1 ) //if not login page 
        {
            //if user not login (doesn't have session)
            if(HttpContext.Current.Session["user"] == null) 
            {   //redirect to Login page
                ha.Context.Response.Redirect("~/Home/Login");
            }
        }
    }
} 

2. add AuthenticModule to web.config

<system.webServer>
 <modules>
  <add name="AuthenticModule" type="NAMESPACE.AuthenticModule, ASSEMBLY_NAME"></add>
 </modules>
</system.webServer>

但是我有一个问题,假设我在/Home/Login中有Home/IndexHomeController页,并且Home/Index页contians <img src="/IMG/tree.jpg" />的html:

public class HomeController : Controller
{
    public ActionResult Login()
    {
        Session["user"] = "user";
        return Content("Logining");
    }
    public ActionResult Index()
    {
        return View();
    }
}

and Home/Index Page contians <img src="/IMG/tree.jpg" />

然后

首先进入网址/Home/Login,然后进入context_PreRequestHandlerExecute,并且由于该网址包含“登录名”,因此它将通过并进入Login()操作,它将设置会话,这意味着此处的登录成功非常简单。

我的问题是,如果我随后运行/Home/Index,则<img src="/IMG/tree.jpg" />也会向context_PreRequestHandlerExecute发送请求,而我发现HttpContext.Current.Session是NULL,并导致Session["user"]为空引用异常

因此,只要任何页面包含对服务器自身映像的img src引用,这种身份验证方法都会失败。

这里有什么可以改进的方法,即使页面包含IHttpModule对服务器自身映像的引用,也可以使这种img src身份验证方式正常工作吗?还是一个盲目的小巷?

0 个答案:

没有答案