如何从ASP.NET MVC中的窗体身份验证拦截401?

如果用户没有正确的权限,我想生成一个401页面.

用户请求一个url并被重定向登录页面(我已经在web.config中拒绝所有的匿名者).用户登录成功,并重定向到原始网址.但是,经过许可检查,确定用户没有必要的权限,所以我想生成一个401.但是表单验证总是处理401并将用户重定向登录页面.

对我来说,这是不正确的.用户已经认证,用户没有正确的授权.

在其他情况下,例如在ajax或REST服务方案中,我绝对不希望登录页面 – 我需要正确的401页面.

到目前为止,我已经尝试过自定义授权过滤器以401返回ViewResult但没有工作.然后,我尝试了一个常规的Action Filter,覆盖了OnActionExecuting,这也不起作用.

我能够做的是处理global.asax中的事件,PostRequestHandlerExecute,然后检查权限,然后直接写入响应:

if (permissionDenied)
{
    Context.Response.StatusCode = 401;
    Context.Response.Clear();
    Context.Response.Write("Permission Denied");
    Context.Response.Flush();
    Context.Response.Close();
    return;
}

这有用,但它并不是我想要的.
首先,我甚至不确定这是否是正确的事件,或者正在进行中的地方.
其次,我希望401页面有更多的内容.最好是一个aspx页面,其页面可能和站点的其余部分可能是一样的.这样,浏览网站的用户就可以看到该权限被拒绝但是具有相同的外观和感觉等等,但是ajax或服务用户将获得正确的状态代码.

有什么想法能如何实现?
我看到有类似请求的其他帖子,但没有看到可以使用的解决方案.

不,我不想要403.

解决方法

我找到了一个可行的解决方案.

FormAuthenticationModule的401重定向发生在EndRequest期间.由于在事件处理期间,在global.asax之前调用模块,所以我们可以在FormsAuthenticationModule对请求进行篡改之后重写状态代码.

在我自定义的AuthorizationFilter中,我将HttpContext.Items [“PermissionDenied”]设置为true,然后在我的global.asax EndRequest中,将状态代码从200翻转到401.然后我将Server.Transfer转到我的自定义PermissionDenied视图.

我仍然会喜欢FormsAuthenticationModule本身已经更新以处理这种情况,但我认为这不是太骇人听闻,我认为我可以与它一起生活.

显然,你可以改变你如何发信号通知global.asax应该翻转状态码.我刚刚尝试将状态代码设置为511,并将其用作条件而不是HttpContext.Items,并且也起作用.我猜到,正确的状态代码一下就出门了,ASP.NET引擎不在乎.

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...