ฉันกำลังอ่านจากแหล่งข้อมูลหลายแห่ง (หนังสือและคำตอบ SO) เกี่ยวกับการอนุญาตใน WebApi
สมมติว่าฉันต้องการเพิ่มแอตทริบิวต์ที่กำหนดเองซึ่งอนุญาตให้เข้าถึงได้สำหรับผู้ใช้บางรายเท่านั้น:
กรณีที่ # 1
ฉันเคยเห็นวิธีการ ลบล้าง OnAuthorization
นี้ซึ่งกำหนดการตอบสนองหากมีบางอย่างผิดปกติ
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ( /*check if user OK or not*/)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}
}
กรณีที่ # 2
แต่ฉันก็เคยเห็นตัวอย่างที่คล้ายกันนี้ซึ่งแทนที่ OnAuthorization
ด้วย แต่ด้วยการโทรไปที่base
:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
// If not authorized at all, don't bother
if (actionContext.Response == null)
{
//...
}
}
จากนั้นตรวจสอบว่า
HttpActionContext.Response
ได้ตั้งค่าไว้หรือไม่ หากไม่ได้ตั้งค่าไว้แสดงว่าคำขอนั้นได้รับอนุญาตและผู้ใช้ก็โอเค
กรณีที่ # 3
แต่ฉันก็เคยเห็นวิธีการลบล้างนี้ด้วยIsAuthorized
:
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext context)
{
if ( /*check if user OK or not*/)
{
return true;// or false
}
}
}
กรณีที่ # 4
จากนั้นฉันก็เห็นตัวอย่างที่คล้ายกัน แต่มีการเรียก base.IsAuthorized (บริบท):
protected override bool IsAuthorized(HttpActionContext context)
{
if (something1 && something2 && base.IsAuthorized(context)) //??
return true;
return false;
}
อีกหนึ่งสิ่ง
และในที่สุด Dominick ก็พูดที่นี่ :
คุณไม่ควรแทนที่ OnAuthorization เพราะคุณจะขาดการจัดการ [AllowAnonymous]
คำถาม
1) ฉันควรใช้วิธีใด:
IsAuthorized
หรือOnAuthorization
? (หรือใช้เมื่อใด)2) เมื่อไหร่ที่ฉันควรโทรหา
base.IsAuthorized or
base OnAuthorization`?3) นี่เป็นวิธีที่พวกเขาสร้างขึ้นหรือไม่? ว่าถ้าการตอบสนองเป็นโมฆะทุกอย่างก็โอเค? (กรณี # 2)
NB
โปรดสังเกตว่าฉันใช้ (และต้องการใช้) เฉพาะAuthorizeAttribute
ที่สืบทอดมาแล้ว เท่านั้นAuthorizationFilterAttribute
ทำไม?
เป็นขั้นตอนแรกใน: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
อย่างไรก็ตามฉันขอผ่านการขยายแอตทริบิวต์ Authorize