gpt4 book ai didi

asp.net-mvc - 在 Asp.Net MVC 2 中,有没有更好的方法来返回 401 状态代码而无需进行身份验证重定向

转载 作者:行者123 更新时间:2023-12-04 12:01:16 26 4
gpt4 key购买 nike

我的网站的一部分有一个轻量级的 xml/json REST API。我的大部分站点都在表单例份验证之后,但只有我的一些 API 操作需要身份验证。

我的 API 有一个自定义 AuthorizeAttribute 用于检查某些权限,当它失败时会导致 401。一切都很好,除非我使用表单例份验证,Asp.net 方便地将其转换为 302 重定向到我的登录页面。

我之前看过一些问题 返回 403 或在 global.asax 中放入一些逻辑似乎有点黑客。 protected void Application_EndRequest()
在满足任何标准的情况下,这基本上会将 302 转换为 401。

  • Previous Question
  • Previous Question 2

  • 我现在正在做的事情有点像问题之一,但不是检查 Application_EndRequest() 对于 302,我让我的授权属性返回 666 这向我表明我需要将其设置为 401。

    这是我的代码:
    protected void Application_EndRequest()
    {
    if (Context.Response.StatusCode == MyAuthAttribute.AUTHORIZATION_FAILED_STATUS)
    {
    //check for 666 - status code of hidden 401
    Context.Response.StatusCode = 401;
    }
    }

    即使这样有效, 我的问题是在 Asp.net MVC 2 中有什么东西可以阻止我这样做吗?或者,一般来说有更好的方法吗? 我认为这对于任何使用 REST api 的人或只是在他们的 Controller 中执行 ajax 请求的人来说都会出现很多问题。您想要做的最后一件事是执行请求并获取登录页面的内容而不是 json。

    最佳答案

    如何使用自定义过滤器装饰您的 Controller /操作:

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
    {
    public void OnAuthorization(AuthorizationContext filterContext)
    {
    var user = filterContext.HttpContext.User;
    if (!user.Identity.IsAuthenticated)
    {
    filterContext.HttpContext.Response.StatusCode = 401;
    filterContext.HttpContext.Response.End();
    }
    }
    }

    并在您的 Controller 中:
    public class HomeController : Controller
    {
    public ActionResult Index()
    {
    return View();
    }

    [RequiresAuthentication]
    public ActionResult AuthenticatedIndex()
    {
    return View();
    }
    }

    关于asp.net-mvc - 在 Asp.Net MVC 2 中,有没有更好的方法来返回 401 状态代码而无需进行身份验证重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2816637/

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