ฉันประหลาดใจที่ฉันไม่สามารถหาตัวอย่างที่ชัดเจนของวิธีการรับรองความถูกต้องของผู้ใช้จากหน้าจอเข้าสู่ระบบจนถึงการใช้แอตทริบิวต์อนุญาตเหนือวิธี ApiController ของฉันหลังจาก Googling หลายชั่วโมง
นั่นเป็นเพราะคุณเริ่มสับสนกับแนวคิดสองข้อนี้:
การรับรองความถูกต้องเป็นกลไกที่ระบบสามารถระบุผู้ใช้ของตนได้อย่างปลอดภัย ระบบรับรองความถูกต้องให้คำตอบสำหรับคำถาม:
- ใครคือผู้ใช้?
- เป็นผู้ใช้จริง ๆ ที่เขา / เธอหมายถึงตัวเองเป็น
การอนุญาตเป็นกลไกที่ระบบจะกำหนดระดับการเข้าถึงของผู้ใช้ที่ได้รับการรับรองความถูกต้องโดยเฉพาะควรมีการรักษาความปลอดภัยทรัพยากรที่ควบคุมโดยระบบ ตัวอย่างเช่นระบบการจัดการฐานข้อมูลอาจได้รับการออกแบบเพื่อให้บุคคลที่ระบุบางอย่างมีความสามารถในการดึงข้อมูลจากฐานข้อมูล แต่ไม่สามารถเปลี่ยนข้อมูลที่เก็บไว้ในฐานข้อมูลในขณะที่ให้บุคคลอื่นสามารถเปลี่ยนข้อมูลได้ ระบบอนุญาตให้คำตอบสำหรับคำถาม:
- user X ได้รับอนุญาตให้เข้าถึงทรัพยากร R หรือไม่
- user X ได้รับอนุญาตให้ดำเนินการ P หรือไม่
- user X ได้รับอนุญาตให้ดำเนินการ P บนทรัพยากร R หรือไม่
Authorize
แอตทริบิวต์ใน MVC จะใช้ในการใช้กฎการเข้าถึงตัวอย่างเช่น:
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
กฎข้างต้นจะอนุญาตเฉพาะผู้ใช้ในบทบาทผู้ดูแลระบบและผู้ใช้ระดับสูงเท่านั้นในการเข้าถึงวิธีการ
กฎเหล่านี้ยังสามารถตั้งค่าในไฟล์ web.config โดยใช้location
องค์ประกอบ ตัวอย่าง:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
อย่างไรก็ตามก่อนที่กฎการให้สิทธิ์เหล่านั้นจะถูกดำเนินการที่คุณจะต้องมีการรับรองความถูกต้องไปยังเว็บไซต์ปัจจุบัน
แม้ว่าสิ่งเหล่านี้จะอธิบายวิธีจัดการกับคำขอที่ไม่ได้รับอนุญาต แต่สิ่งเหล่านี้ก็ไม่ได้แสดงให้เห็นอย่างชัดเจนเช่น LoginController หรือบางอย่างเช่นนั้นเพื่อขอข้อมูลประจำตัวผู้ใช้และตรวจสอบความถูกต้อง
จากที่นี่เราสามารถแยกปัญหาออกเป็นสองส่วน:
รับรองความถูกต้องผู้ใช้เมื่อใช้บริการ Web API ภายในเว็บแอปพลิเคชันเดียวกัน
นี่จะเป็นวิธีที่ง่ายที่สุดเพราะคุณจะต้องใช้การตรวจสอบความถูกต้องใน ASP.Net
นี่คือตัวอย่างง่ายๆ:
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังเส้นทางบัญชี / การเข้าสู่ระบบที่นั่นคุณจะทำการควบคุมแบบกำหนดเองเพื่อขอข้อมูลประจำตัวผู้ใช้จากนั้นคุณจะตั้งค่าคุกกี้การรับรองความถูกต้องโดยใช้:
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
การพิสูจน์ตัวตนข้ามแพลตฟอร์ม
กรณีนี้จะเกิดขึ้นเมื่อคุณเปิดเผยบริการ Web API ภายในแอปพลิเคชันเว็บเท่านั้นดังนั้นคุณจะมีไคลเอนต์อื่นที่ใช้บริการลูกค้าอาจเป็นแอปพลิเคชันเว็บอื่นหรือแอปพลิเคชัน. Net (Win Forms, WPF, คอนโซล, บริการ Windows) ฯลฯ )
ตัวอย่างเช่นสมมติว่าคุณจะใช้บริการ Web API จากเว็บแอปพลิเคชันอื่นในโดเมนเครือข่ายเดียวกัน (ภายในอินทราเน็ต) ในกรณีนี้คุณสามารถใช้การรับรองความถูกต้อง Windows ที่ ASP.Net จัดหาให้
<authentication mode="Windows" />
หากบริการของคุณปรากฏบนอินเทอร์เน็ตคุณจะต้องส่งโทเค็นที่ผ่านการตรวจสอบแล้วไปยังบริการ Web API แต่ละบริการ
สำหรับข้อมูลเพิ่มเติมนำของขวัญไปที่บทความต่อไปนี้: