Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การใช้งาน Authorize Attribute ใน C# ASP.NET WebAPI

Authorization (การอนุญาต) คือกระบวนการตัดสินใจว่า Authenticated User ได้รับอนุญาตให้กระทำ Action บน Resource เฉพาะ (Web API Resource) หรือไม่ เช่น การมีสิทธิ์ Get และ Post Data เป็นส่วนหนึ่งของ Authorization กระบวนการ Authorization เกิดขึ้นก่อน Execute Controller Action Method ให้ความยืดหยุ่นตัดสินใจว่าให้ Grant Access ไปยัง Resource นั้นหรือไม่

ใน ASP.NET Web API Authorization ถูก Implement โดยใช้ Authorization Filters ซึ่งจะ Execute ก่อน Controller Action Method Web API จัดเตรียม Built-in Authorization Filter คือ AuthorizeAttribute Filter นี้ตรวจสอบว่า User Authenticated แล้วหรือไม่ ถ้าไม่ จะคืน HTTP Status Code 401 (Unauthorized) โดยไม่ Invoke Action

เราสามารถ Apply Filter ได้ 3 ระดับ:

1. Globally (ระดับ Global)

เพื่อจำกัดการเข้าถึงทุก Web API Controller ให้เพิ่ม AuthorizeAttribute Filter ใน Global Filter List


public static void Register(HttpConfiguration config) {
    config.Filters.Add(new AuthorizeAttribute());
}

2. Controller Level

เพื่อจำกัด Controller เฉพาะตัว ให้เพิ่ม Filter เป็น Attribute บน Controller


// Require authorization for all actions on the controller
[Authorize]
public class StudentsController : ApiController {
    public HttpResponseMessage Get(int id) { ... }
    public HttpResponseMessage Post() { ... }
}

3. Action Level

เพื่อจำกัด Action เฉพาะตัว ให้เพิ่ม Attribute บน Action Method


public class StudentsController : ApiController {
    public HttpResponseMessage Get() { ... }
    
    // Require authorization for a specific action
    [Authorize]
    public HttpResponseMessage Post() { ... }
}

ตัวอย่าง


using System.Web.Http;

namespace DemoWebApplication.Controllers {
    public class DemoController : ApiController {
        [Authorize]
        public IHttpActionResult Get() {
            return Ok();
        }
    }
}

เนื่องจากเราเพิ่ม Authorize Attribute บน Action Method การเข้าถึงต้องมี Authorization ที่เหมาะสม เช่น Bearer Token, API Key, OAuth ฯลฯ การเข้าถึงโดยไม่ได้รับอนุญาตจะได้ Response 401 Unauthorized

Authorize Attribute Parameters


// เฉพาะ Roles ที่ระบุ
[Authorize(Roles = "Admin, Manager")]

// เฉพาะ Users ที่ระบุ
[Authorize(Users = "user1,user2")]

// รวมทั้ง Roles และ Users
[Authorize(Roles = "Admin", Users = "superuser")]

// Policy-based Authorization (ASP.NET Core)
[Authorize(Policy = "RequireAdminRole")]

AllowAnonymous - ยกเว้นจาก Authorization


[Authorize] // Controller ต้องการ Auth
public class ValuesController : ApiController {
    // Action นี้เข้าถึงได้โดยไม่ต้อง Auth
    [AllowAnonymous]
    public IHttpActionResult GetPublic() {
        return Ok("Public data");
    }
    
    // Action นี้ต้อง Auth (สืบทอดจาก Controller)
    public IHttpActionResult GetPrivate() {
        return Ok("Private data");
    }
}

Custom Authorization Filter


public class CustomAuthorizeAttribute : AuthorizeAttribute {
    protected override bool IsAuthorized(HttpActionContext actionContext) {
        // Custom logic: Check claims, permissions, etc.
        var principal = actionContext.RequestContext.Principal;
        if (principal == null || !principal.Identity.IsAuthenticated) {
            return false;
        }
        
        // ตัวอย่าง: ตรวจสอบ Claim เฉพาะ
        var hasPermission = principal.Claims
            .Any(c => c.Type == "permission" && c.Value == "api.access");
        
        return hasPermission || base.IsAuthorized(actionContext);
    }
}

// ใช้งาน
[CustomAuthorize]
public class SecureController : ApiController { ... }

ใน ASP.NET Core (Policy-based)


// Startup.cs
services.AddAuthorization(options => {
    options.AddPolicy("RequireAdmin", policy => 
        policy.RequireRole("Admin").RequireClaim("Department", "IT"));
    
    options.AddPolicy("MinimumAge", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(18)));
});

// Controller
[Authorize(Policy = "RequireAdmin")]
public class AdminController : ControllerBase { ... }