如何从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引擎不在乎. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Asp.net Identity:User.Identity.GetUserI
- asp.net-core – project.json中的框架和导入部分:它们是什
- asp.net-mvc – 我应该在ASP.NET MVC中使用Anti-XSS安全运行
- asp.net-mvc – 使用jQuery.post将多个参数发布到MVC Contr
- 强制CamelCase在ASP.NET WebAPI每个控制器
- asp经典 – ASP Classic中的注释代码
- asp.net – 如何在捕获httpwebrequest超时后关闭底层连接
- asp.net – AWS SNSClient发布请求的超时错误
- asp.net-mvc – 大型Web应用程序中的Windows Workflow用法
- asp.net – MVC 3 htmlhelper的扩展方法来包装内容
- 使用异步页面的ASP.NET中彗星更容易吗?
- asp.net-web-api – 如何设置katana-project以允
- asp.net – 在PostBack期间Recaptcha消失
- 如何重定向到returnUrl在Asp.Net MVC5中工作
- asp.net-mvc – 将JWT令牌存储在cookie中
- 使用Asp.net Mvc3 Razor视图方式扩展JQuery UI W
- ASP.NET MVC 2 – 如何使用IgnoreRoute忽略整个目
- asp.net-mvc – 使用Ajax.Beginform的RedirectTo
- asp.net-mvc – ActionResult上的自定义属性
- asp.net-mvc – MVC 4 ModelBinder
