加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 在Asp.Net MVC 2中有一种更好的方法来返回401状

发布时间:2020-12-16 04:06:10 所属栏目:asp.Net 来源:网络整理
导读:我的网站的一部分有一个轻量级的xml / json REST API.我的大部分网站都在表单身份验证后面,但只有部分API操作需要身份验证. 我有一个用于我的API的自定义AuthorizeAttribute,用于检查某些权限,当它失败时会产生401.一切都很好,除非我使用表单auth,Asp.net方
我的网站的一部分有一个轻量级的xml / json REST API.我的大部分网站都在表单身份验证后面,但只有部分API操作需要身份验证.

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

我已经看到一些以前的问题,似乎有点hackish要么返回403而不是在global.asax protected void Application_EndRequest()中放入一些逻辑
这将基本上将302转换为401,满足任何标准.

> Previous Question
> Previous Question 2

我现在正在做的有点像其中一个问题,但不是检查Application_EndRequest()的302,而是让我的authorize属性返回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的人或只是在他们的控制器中执行ajax请求的人来说,这会有很多.你想要的最后一件事是做一个请求并获取登录页面的内容而不是json.

解决方法

如何使用自定义过滤器修饰控制器/操作:
[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();
        }
    }
}

在你的控制器中:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读