2012-05-10 73 views
1

我试图建立以登录到使用.NET MVC,基本要求的控制器/行动试图擅自接入的最佳方式是:记录/审计403个请求

  1. 如果他们还没有登录那么我们希望将它们重定向到登录页面
  2. 如果他们已登录但没有正确的页面凭证,那么我们希望记录有关请求的信息,他们是谁,一些HttpRequest等等,然后重定向他们到特定的未经授权的访问页面。

1显然是通过.net mvc [Authorize]属性过滤器默认处理的。 2我已经部分实现了,我创建了一个特定的Authorization属性,该属性扩展了Authorize操作筛选器,该筛选器覆盖默认的HandleUnauthorizedRequest方法,以检查一些额外的事情并返回响应代码为403的HttpResult。

我在实现其他部分时遇到困难,将信息记录到数据库。当然,有一种简单的解决方法,从自定义属性本身中进行记录,但这种方式感觉不对,感觉就像我将属性本身变得更聪明,然后应该是这样,在一天结束时它应该只知道关于限制访问而不是关于将信息记录到数据库。

还有另一种解决方案,当它到达未经授权的页面本身时,它就会记录下来,它不会感觉不好,但仍然感觉不太正确。

就我个人而言,我希望能够在请求链内的某处处理它,但据我所知,没有地方可以访问所有正确的信息。我试过在这里四处寻找,但还没有找到任何与我们的解决方案非常相符的东西。

有没有人在那里实现类似于我们要做的事情,或者对于应该在哪里实施这些事情有任何想法。

感谢, MD

回答

2

创建一个新的IHttpModule并登录的EndRequest事件作弊黑客...

例如

public class UnAuthorizedLoggerHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += ContextOnEndRequest; 
    } 

    private void ContextOnEndRequest(object sender, EventArgs eventArgs) 
    { 
     var app = sender as HttpApplication; 

     if (app == null) return; 

     if (app.Response.StatusCode == (int)HttpStatusCode.Forbidden) 
     { 
      //Log the error 
      //All the user info should be in app.Request 
     } 
    } 
} 
+0

这真是太棒了,正是我们所期待的! – MDo