Jih*_*Han 14 asp.net asp.net-mvc authorization action-filter
如果用户没有正确的权限,我想生成一个401页面.
用户请求一个URL并被重定向到登录页面(我在web.config中拒绝所有匿名).用户成功登录并重定向到原始URL.但是,在权限检查时,确定用户没有所需的权限,因此我想生成401.但是表单身份验证始终处理401并将用户重定向到登录页面.
对我来说,这是不正确的.用户已经过身份验证,用户只是没有正确的授权.
在其他场景中,例如在ajax或REST服务场景中,我绝对不希望登录页面 - 我需要正确的401页面.
到目前为止,我已经尝试使用自定义授权过滤器来返回ViewResult 401但无法正常工作.然后,我尝试了一个正常的动作过滤器,覆盖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;
}
Run Code Online (Sandbox Code Playgroud)
这可行,但它不是我想要的.首先,我甚至不确定这是否是正确的事件或管道中的地方.其次,我希望401页面有更多内容.优选地,它应该是aspx页面,其可能与站点的其余部分具有相同的母版页.这样,浏览网站的任何人都可以看到权限被拒绝但具有相同的外观和感觉等,但是ajax或服务用户将获得正确的状态代码来执行操作.
知道如何实现这一目标吗?我见过其他类似请求的帖子,但没有看到我可以使用的解决方案.
不,我不想要403.
我找到了一个可行的解决方案.
在EndRequest期间发生FormsAuthenticationModule的 401重定向.因为在事件处理期间,在global.asax之前调用模块,所以我们可以在FormsAuthenticationModule将grubby动手放在请求之后覆盖状态代码.
在我的自定义AuthorizationFilter中,我将HttpContext.Items ["PermissionDenied"]设置为true,然后在我的global.asax EndRequest中,我将状态代码从200翻转到401.然后我将Server.Transfer转到我的自定义PermissionDenied视图.
我仍然更喜欢FormsAuthenticationModule本身已更新以处理这种情况,但我认为这不是太过于hackish我认为我可以忍受它.
显然,你可以改变你发信号通知global.asax应该翻转状态代码的方式.我只是尝试将状态代码设置为511,并将其用作条件而不是HttpContext.Items,并且也可以.我想只要正确的状态代码出门,ASP.NET引擎就不在乎了.
HttpContext.Current.Response.SuppressFormsAuthenticationRedirect = true;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5785 次 |
| 最近记录: |