我找到了一种通过IHttpModule
和Session
进行身份验证的方法,
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/Index
和HomeController
页,并且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
身份验证方式正常工作吗?还是一个盲目的小巷?