gpt4 book ai didi

asp.net - 如何从 ASP.NET MVC 中的表单例份验证中拦截 401?

转载 作者:行者123 更新时间:2023-12-03 22:22:45 27 4
gpt4 key购买 nike

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

用户请求一个 url 并被重定向到登录页面(我在 web.config 中拒绝了所有匿名)。用户登录成功并被重定向到原始 url。但是,经过权限检查,确定用户没有所需的权限,所以我想生成一个 401。但是 Forms Authentication 总是处理 401 并将用户重定向到登录页面。

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

在其他场景中,例如在 ajax 或 REST 服务场景中,我绝对不想要登录页面——我需要正确的 401 页面。

到目前为止,我已经尝试自定义授权过滤器以返回 401 的 ViewResult 但没有奏效。然后我尝试了一个普通的 Action 过滤器,覆盖了 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。

最佳答案

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

在 EndRequest 期间发生 FormsAuthenticationModule 的 401 重定向。由于在事件处理期间模块在 global.asax 之前被调用,我们可以在 FormsAuthenticationModule 处理请求之后覆盖状态代码。

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

我仍然希望 FormsAuthenticationModule 本身已更新以处理这种情况,但我认为这并不太老套,我认为我可以忍受它。

显然,您可以更改表示 global.asax 应该翻转状态代码的方式。我只是尝试将状态代码设置为 511 之类的东西,并将其用作条件而不是 HttpContext.Items 并且效果也很好。我猜只要正确的状态代码出现在门外,ASP.NET 引擎就不会在意。

关于asp.net - 如何从 ASP.NET MVC 中的表单例份验证中拦截 401?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2931791/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com