使用[Authorize]属性与User.Identity.IsAuthenticated保护Web API

时间:2014-05-18 13:28:58

标签: c# asp.net asp.net-web-api identity

我有一个WebAPI控制器,要求用户进行身份验证,我正在使用MS Identity 2.0进行身份验证。控制器看起来有点像这样:

[Route("MyRoute")]
[Authorize]
[HttpPost]
public HttpResponseMessage Post([FromBody] string value)
{
  if (User.Identity.IsAuthenticated == true)
  {
     .... 
  }
  else
  {
      return new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
  } 

如果我一次删除其中一个选项,在这两种情况下,当未经授权的用户调用控制器时,它会返回Forbidden响应。这两个选项有什么不同,哪一个比另一个好?

感谢。

2 个答案:

答案 0 :(得分:2)

使用[Authorize]属性,授权逻辑可以使用过滤器覆盖,并且位于代码的中心位置。

if (User.Identity.IsAuthenticated == true)
{
   .... 
}
else
{
    return new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
}

基本上与默认的[Authorize]功能相同,但您会一遍又一遍地重复自己。

虽然技术细节是,授权过滤器[Authorize]位于管道中较高的位置,因此Forbidden对您的服务器来说效率更高。

请参阅:http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html

答案 1 :(得分:1)

通过"授权"您可以为所有请求集中创建请求过滤器。它易于管理。就像想要使用像WebSecurity这样的不同身份验证提供程序一样,您只需要更改一个类而不是所有的web apis,如下所示:

[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : AuthorizationFilterAttribute
    {       
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            base.OnAuthorization(actionContext);            

            ////check authentication and return if not authorized
            if (actionContext != null)
            {
                if (!WebSecurity.IsAuthenticated)
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request };
                     return;
                }             

            }
        }
    }