与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响应。这两种选择有什么区别,是否有一种比另一种更好?
使用[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;
}
}
}
}