如何从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; } 这有用,但它并不是我想要的. 有什么想法能如何实现? 不,我不想要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引擎不在乎. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何使用Server.MapPath来获取ASP.NET中的网站文件夹外的位
- asp.net-mvc – Microsoft MVC 4,APIController和适当的RES
- asp.net – “更新/取消”按钮不会出现在TemplateField Edi
- asp.net – 是否有相当于mod_pagespeed Apache模块的IIS?
- asp.net – 动态CheckBoxFor有一些禁用
- asp.net – 无法加载文件或程序集App_Licenses
- .net core使用sentry添加程序异常报警功能
- Asp.net SignalR 让实时通讯变得如此简单
- asp.net-core – 如何获取ASP.NET Core中的中间件列表
- asp.net-mvc – ASP.NET MVC AjaxHelper是否处理了降级?