与user . identity . isauthenticated相比,使用[authorization]属性保护We

本文关键字:authorization 属性 保护 We 使用 identity user isauthenticated 相比 | 更新日期: 2023-09-27 18:03:48

我有一个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响应。这两种选择有什么区别,是否有一种比另一种更好?

与user . identity . isauthenticated相比,使用[authorization]属性保护We

使用[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

通过"Authorize"属性,您可以为所有请求集中创建请求过滤器。这很容易管理。比如如果你想使用不同的认证提供商,比如WebSecurity,那么你只需要在一个类中更改,而不是像下面这样更改所有的web api:

[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;
                }             
            }
        }
    }