Gre*_*rts 7 rest asp.net-mvc asp.net-mvc-2
我的网站的一部分有一个轻量级的xml/json REST API.我的大部分网站都在表单身份验证后面,但只有部分API操作需要身份验证.
我有一个用于我的API的自定义AuthorizeAttribute,用于检查某些权限,当它失败时会产生401.一切都很好,除非我使用表单auth,Asp.net方便地将其转换为302重定向到我的登录页面.
我已经看到一些以前的问题,似乎有点hackish要么返回403,要么在global.asax protected void Application_EndRequest() 中放入一些逻辑 ,它将基本上将302转换为401,满足任何条件.
我现在正在做的有点像其中一个问题,但不是检查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;
}
}
Run Code Online (Sandbox Code Playgroud)
即使这有效,我的问题是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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在您的控制器中:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[RequiresAuthentication]
public ActionResult AuthenticatedIndex()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
我仍在使用结束请求技术,所以我想我会把这个作为答案,但实际上 这里列出的任何一个选项通常都是我所说的迄今为止最好的答案。
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == MyAuthAttribute.AUTHORIZATION_FAILED_STATUS)
{
//check for 666 - status code of hidden 401
Context.Response.StatusCode = 401;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3492 次 |
| 最近记录: |