我有一个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响应。这两个选项有什么不同,哪一个比另一个好?
感谢。
答案 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;
}
}
}
}