Authorization là quá trình quyết định user đã authenticated có được phép thực hiện action trên resource cụ thể (Web API Resource) hay không. Ví dụ: quyền get data và post data là phần của authorization. Authorization Process xảy ra trước khi execute Controller Action Method, cung cấp flexibility quyết định có grant access resource hay không.
Trong ASP.NET Web API authorization được implement bằng Authorization filters chạy trước controller action method. Web API cung cấp built-in authorization filter: AuthorizeAttribute. Filter này check user authenticated. Nếu không, trả HTTP 401 (Unauthorized), không invoke action.
Có thể apply filter globally, ở controller level, hoặc action level.
Global
Để restrict access cho mọi Web API controller, thêm AuthorizeAttribute vào global filter list.
public static void Register(HttpConfiguration config) {
config.Filters.Add(new AuthorizeAttribute());
}
Controller
Để restrict controller cụ thể, thêm attribute lên controller.
// Require authorization for all actions on the controller.
[Authorize]
public class StudentsController : ApiController {
public HttpResponseMessage Get(int id) { ... }
public HttpResponseMessage Post() { ... }
}
Action
Để restrict action cụ thể, thêm attribute lên action method.
public class StudentsController : ApiController {
public HttpResponseMessage Get() { ... }
// Require authorization for a specific action.
[Authorize]
public HttpResponseMessage Post() { ... }
}
Ví dụ
using System.Web.Http;
namespace DemoWebApplication.Controllers {
public class DemoController : ApiController {
[Authorize]
public IHttpActionResult Get() {
return Ok();
}
}
}
Vì thêm authorize attribute trên action method, proper authorization như bearer token, API key, OAuth cần dùng để access action. Unauthorized access trả về 401 Unauthorized.
Authorize Attribute Parameters
1. Roles
[Authorize(Roles = "Admin,Manager")]
public IHttpActionResult Delete(int id) { ... }
2. Users (specific users)
[Authorize(Users = "alice,bob")]
public IHttpActionResult AdminOnly() { ... }
3. Policy-based (ASP.NET Core)
// Startup.cs
services.AddAuthorization(options => {
options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
options.AddPolicy("MinimumAge18", policy => policy.Requirements.Add(new MinimumAgeRequirement(18)));
});
// Controller
[Authorize(Policy = "RequireAdminRole")]
public IActionResult AdminPanel() { ... }
Authentication vs Authorization
| Khía cạnh | Authentication (Xác thực) | Authorization (Phân quyền) |
|---|---|---|
| Câu hỏi | Bạn là ai? | Bạn được làm gì? |
| Filter | IAuthenticationFilter | IAuthorizationFilter / [Authorize] |
| Kết quả fail | 401 Unauthorized | 403 Forbidden |
| Ví dụ | Login, JWT token, API Key | Roles, Policies, Claims |
Custom Authorization Filter
public class CustomAuthorizeAttribute : AuthorizeAttribute {
protected override bool IsAuthorized(HttpActionContext actionContext) {
// Custom logic: check claims, permissions, time, IP, etc.
var user = actionContext.ControllerContext.RequestContext.Principal;
return user != null && user.Identity.IsAuthenticated
&& user.HasClaim("permission", "api.access");
}
}
// Sử dụng
[CustomAuthorize]
public IHttpActionResult SecureAction() { ... }
ASP.NET Core - Endpoint Routing Authorization
// Program.cs / Startup.cs
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers().RequireAuthorization(); // Global
// Hoặc per endpoint
app.MapGet("/api/admin", () => "Admin only").RequireAuthorization("AdminPolicy");