ใช้งานง่ายและน้ำหนักเบามาก สไตล์ Microsoft Basic Scheme Authentication Implementation สำหรับ ASP.NET Core
ดูบน GitHub
.NET Framework 4.6.1 และ/หรือ NetStandard 2.0 เป็นต้นไป
หลายเป้าหมาย: net8.0; เน็ต7.0; net6.0; เน็ต5.0; netcoreapp3.1; netcoreapp3.0; เน็ตมาตรฐาน2.0; net461
ไลบรารีนี้เผยแพร่บน NuGet ดังนั้นแพ็คเกจ NuGet จึงสามารถติดตั้งลงในโปรเจ็กต์ของคุณได้โดยตรง หากคุณต้องการใช้โดยไม่ต้องทำการเปลี่ยนแปลงโค้ดแบบกำหนดเอง
ดาวน์โหลดโดยตรงจากลิงค์ด้านล่าง โปรดพิจารณาดาวน์โหลดแพ็คเกจใหม่เนื่องจากแพ็คเกจเก่าล้าสมัยแล้ว
ลิงก์แพ็คเกจใหม่ - AspNetCore.Authentication.Basic
ลิงก์แพ็คเกจเก่า - Mihir.AspNetCore.Authentication.Basic
หรือโดยการรันคำสั่งด้านล่างในโครงการของคุณ
PM> Install-Package AspNetCore.Authentication.Basic
ตัวอย่างมีอยู่ในไดเร็กทอรีตัวอย่าง
การตั้งค่ามันค่อนข้างง่าย คุณจะต้องมีความรู้พื้นฐานในการทำงานเกี่ยวกับ ASP.NET Core 2.0 หรือใหม่กว่าเพื่อเริ่มต้นใช้งานไลบรารีนี้
มี 2 วิธีในการใช้ไลบรารีนี้เพื่อทำงาน สามารถผสมทั้งสองวิธีได้หากจำเป็น
1] การใช้การใช้งาน IBasicUserValidationService
2] การใช้ BasicOptions.Events (ผู้รับมอบสิทธิ์ OnValidateCredentials) ซึ่งเป็นแนวทางเดียวกับที่คุณจะพบในไลบรารีการตรวจสอบสิทธิ์ของ Microsoft
หมายเหตุ:
จำเป็นต้องตั้งค่า Realm ในตัวเลือกหากไม่ได้ตั้งค่า SuppressWWWAuthenticateHeader
ถ้ามีการใช้อินเทอร์เฟซ IBasicUserValidationService รวมถึง BasicOptions.Events.OnValidateCredentials ผู้รับมอบสิทธิ์ได้รับการตั้งค่าด้วย ผู้รับมอบสิทธิ์นี้จะถูกนำมาใช้ก่อน
ใช้โปรโตคอล HTTPS (ใบรับรอง SSL) ในการผลิตเสมอเมื่อใช้การตรวจสอบสิทธิ์ขั้นพื้นฐาน
โดยใช้ AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// มันต้องมี Realm ที่จะตั้งค่าในตัวเลือกต่างๆ ถ้าไม่ได้ตั้งค่า SuppressWWWAuthenticateHeader// ถ้ามีการใช้อินเทอร์เฟซ IBasicUserValidationService เช่นเดียวกับตัวเลือก .Events.OnValidateCredentials ผู้รับมอบสิทธิ์ได้รับการตั้งค่าด้วย จากนั้นผู้รับมอบสิทธิ์นี้จะถูกนำมาใช้ first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// AddBasic ด้านล่างที่ไม่มีพารามิเตอร์ประเภทจะต้องมีการตั้งค่า options.Events.OnValidateCredentials delege เพื่อตั้งค่า//.AddBasic(options => { options.Realm = "My App"; }) ;// พารามิเตอร์ AddBasic with type ด้านล่างจะเพิ่ม BasicUserValidationService ให้กับคอนเทนเนอร์การขึ้นต่อกัน .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddControllers();//// ตามค่าเริ่มต้น การรับรองความถูกต้องจะไม่ถูกท้าทายสำหรับทุกคำขอซึ่งเป็นค่าเริ่มต้นของ ASP.NET Core behaviour.//// ดังนั้นเพื่อท้าทายการตรวจสอบสิทธิ์สำหรับทุกคำขอโปรดใช้ตัวเลือก FallbackPolicy ด้านล่าง //services.AddAuthorization(options =>//{// options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();//});} public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseHttpsRedirection();// ลำดับด้านล่างของไปป์ไลน์เชนคือ สำคัญ!app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
โดยใช้ AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// มันต้องมี Realm ที่จะตั้งค่าในตัวเลือกต่างๆ ถ้าไม่ได้ตั้งค่า SuppressWWWAuthenticateHeader// ถ้ามีการใช้อินเทอร์เฟซ IBasicUserValidationService เช่นเดียวกับตัวเลือก .Events.OnValidateCredentials ผู้รับมอบสิทธิ์ได้รับการตั้งค่าด้วย จากนั้นผู้รับมอบสิทธิ์นี้จะถูกนำมาใช้ first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// AddBasic ด้านล่างที่ไม่มีพารามิเตอร์ประเภทจะต้องมีการตั้งค่า options.Events.OnValidateCredentials delege เพื่อตั้งค่า//.AddBasic(options => { options.Realm = "My App"; }) ;// พารามิเตอร์ AddBasic พร้อม type ด้านล่างจะเพิ่ม BasicUserValidationService ให้กับคอนเทนเนอร์การขึ้นต่อกัน .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddMvc();//// ตามค่าเริ่มต้น การรับรองความถูกต้องจะไม่ถูกท้าทายสำหรับทุกคำขอซึ่งเป็นค่าเริ่มต้นของ ASP.NET Core behaviour.//// ดังนั้นเพื่อท้าทายการตรวจสอบสิทธิ์สำหรับทุกคำขอโปรดใช้ตัวเลือกด้านล่างแทนบริการข้างต้นAddMvc().//services.AddMvc(options => //{// options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));//});} โมฆะสาธารณะกำหนดค่า (แอป IApplicationBuilder, IHostingEnvironment env) {app.UseAuthentication();app.UseMvc ();}}
ใช้ AspNetCore.Authentication.Basic; คลาสสาธารณะ BasicUserValidationService : IBasicUserValidationService {ส่วนตัวอ่านอย่างเดียว ILogger <BasicUserValidationService> _logger; ส่วนตัวอ่านอย่างเดียว IUserRepository _userRepository; BasicUserValidationService สาธารณะ (ILogger <BasicUserValidationService> คนตัดไม้, IUserRepository userRepository){_logger = logger;_userRepository = userRepository;}งาน async สาธารณะ<bool> IsValidAsync(ชื่อผู้ใช้สตริง, รหัสผ่านสตริง){try{// หมายเหตุ: ห้ามใช้การดำเนินการนี้ นี้มีวัตถุประสงค์เพื่อการสาธิตเท่านั้น// เขียนการใช้งานของคุณที่นี่และส่งคืนจริงหรือเท็จขึ้นอยู่กับการตรวจสอบความถูกต้อง..var user = await _userRepository.GetUserByUsername(username);var isValid = user != null && user.Password ==password;return isValid;} catch (ข้อยกเว้น e) {_logger.LogError (e, e.Message); โยน;}}}
จำเป็นต้องตั้งค่าหาก SuppressWWWAuthenticateHeader ไม่ได้ตั้งค่าเป็นจริง ใช้กับส่วนหัวการตอบกลับ WWW-Authenticate เมื่อท้าทายคำขอที่ไม่ผ่านการรับรองความถูกต้อง
ค่าเริ่มต้นเป็นเท็จ
หากตั้งค่าเป็นจริง จะไม่ส่งคืนส่วนหัวการตอบกลับ WWW-Authenticate เมื่อท้าทายคำขอที่ไม่ผ่านการรับรองความถูกต้อง
หากตั้งค่าเป็น False จะส่งกลับส่วนหัวการตอบกลับ WWW-Authenticate เมื่อท้าทายคำขอที่ไม่ผ่านการรับรองความถูกต้อง
ค่าเริ่มต้นเป็นเท็จ
หากตั้งค่าเป็นจริง ระบบจะตรวจสอบว่าตัวกรอง AllowAnonymous ในการทำงานของคอนโทรลเลอร์หรือข้อมูลเมตาบนตำแหน่งข้อมูลหรือไม่ ซึ่งหากพบ จะไม่พยายามตรวจสอบสิทธิ์คำขอ
วัตถุที่แอปพลิเคชันจัดทำขึ้นเพื่อประมวลผลเหตุการณ์ที่เกิดขึ้นโดยมิดเดิลแวร์การรับรองความถูกต้องขั้นพื้นฐาน
แอปพลิเคชันอาจใช้อินเทอร์เฟซอย่างสมบูรณ์หรืออาจสร้างอินสแตนซ์ของ BasicEvents และมอบหมายผู้รับมอบสิทธิ์ให้กับเหตุการณ์ที่ต้องการประมวลผลเท่านั้น
ผู้รับมอบสิทธิ์ที่ได้รับมอบหมายให้กับคุณสมบัตินี้จะถูกเรียกใช้ก่อนที่จะตรวจสอบข้อมูลรับรอง
คุณต้องระบุผู้รับมอบสิทธิ์สำหรับคุณสมบัตินี้เพื่อให้การรับรองความถูกต้องเกิดขึ้น
ในผู้รับมอบสิทธิ์ของคุณ คุณควรเรียก context.ValidationSucceeded() ซึ่งจะจัดการการสร้างการอ้างสิทธิ์การรับรองความถูกต้องหลักจากรายละเอียดผู้ใช้ซึ่งจะถูกกำหนดบริบทคุณสมบัติ Principal และเรียก context.Success() หรือสร้างหลักการเรียกร้องการรับรองความถูกต้องจากผู้ใช้ รายละเอียดและกำหนดให้กับคุณสมบัติ context.Principal และสุดท้ายก็เรียกเมธอด context.Success()
ถ้าเพียงตั้งค่าคุณสมบัติ context.Principal โดยไม่ต้องเรียกเมธอด context.Success() ดังนั้นเมธอด Success() จะถูกเรียกโดยอัตโนมัติ
ผู้รับมอบสิทธิ์ที่ได้รับมอบหมายให้กับคุณสมบัตินี้จะถูกเรียกใช้เมื่อการรับรองความถูกต้องสำเร็จ มันจะไม่ถูกเรียกถ้ามีการกำหนดผู้รับมอบสิทธิ์ OnValidateCredentials
สามารถใช้สำหรับเพิ่มการอ้างสิทธิ์ ส่วนหัว ฯลฯ ลงในการตอบกลับ
ผู้รับมอบสิทธิ์ที่ได้รับมอบหมายให้กับคุณสมบัตินี้จะถูกเรียกใช้เมื่อมีข้อยกเว้นที่ไม่คาดคิดเกิดขึ้นภายในไลบรารี
ผู้รับมอบสิทธิ์ที่ได้รับมอบหมายให้กับคุณสมบัตินี้จะถูกเรียกใช้ก่อนที่จะส่งคำถามกลับไปยังผู้โทรเมื่อจัดการกับการตอบสนองที่ไม่ได้รับอนุญาต
ใช้สิ่งนี้เฉพาะเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ และหากคุณต้องการใช้การใช้งานแบบกำหนดเอง ตั้งค่าผู้รับมอบสิทธิ์เพื่อจัดการกับข้อกังวลเรื่องความท้าทาย 401 หากรูปแบบการตรวจสอบสิทธิ์ที่เป็นปัญหาเกี่ยวข้องกับการโต้ตอบการตรวจสอบสิทธิ์ซึ่งเป็นส่วนหนึ่งของขั้นตอนการร้องขอ (เช่น การเพิ่มส่วนหัวการตอบกลับ หรือเปลี่ยนผลลัพธ์ 401 เป็น 302 ของหน้าเข้าสู่ระบบหรือตำแหน่งการลงชื่อเข้าใช้ภายนอก)
เรียก context.Handled() ต่อท้ายเพื่อให้ข้ามตรรกะเริ่มต้นสำหรับความท้าทายนี้ไป
ผู้รับมอบสิทธิ์ที่ได้รับมอบหมายให้กับคุณสมบัตินี้จะถูกเรียกใช้หากการอนุญาตล้มเหลวและส่งผลให้เกิดการตอบสนองที่ต้องห้าม
ใช้สิ่งนี้เฉพาะเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ และหากคุณต้องการใช้การใช้งานแบบกำหนดเอง
ตั้งค่าผู้รับมอบสิทธิ์ให้จัดการห้าม
เรียก context.Handled() ต่อท้ายเพื่อให้ข้ามตรรกะเริ่มต้นใดๆ
ด้วย ASP.NET Core คำขอทั้งหมดจะไม่ถูกท้าทายสำหรับการรับรองความถูกต้องตามค่าเริ่มต้น ดังนั้นอย่ากังวลหาก BasicUserValidationService ของคุณไม่ได้รับผลกระทบเมื่อคุณไม่ผ่านรายละเอียดการรับรองความถูกต้องพื้นฐานที่จำเป็นพร้อมกับคำขอ มันเป็นพฤติกรรมปกติ ASP.NET Core ท้าทายการรับรองความถูกต้องเฉพาะเมื่อมีการบอกโดยเฉพาะให้ทำเช่นนั้นโดยการตกแต่งตัวควบคุม/วิธีการด้วยแอตทริบิวต์ตัวกรอง [อนุญาต] หรือโดยวิธีการอื่น
อย่างไรก็ตาม หากคุณต้องการให้คำขอทั้งหมดท้าทายการรับรองความถูกต้องตามค่าเริ่มต้น ขึ้นอยู่กับสิ่งที่คุณใช้ คุณสามารถเพิ่มบรรทัดตัวเลือกด้านล่างลงในวิธี ConfigureServices ในคลาส Startup
// บน ASP.NET Core 3.0 onwardsservices.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();});// หรือ// บน ASP.NET Core 2.0 onwardsservices.AddMvc (options => {options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));});
หากคุณไม่ได้ใช้ MVC แต่ใช้ Endpoints บน ASP.NET Core 3.0 หรือใหม่กว่า คุณสามารถเพิ่ม chain method .RequireAuthorization()
ให้กับ endpoint map ภายใต้ Configure method บนคลาส Startup ดังที่แสดงด้านล่าง
// ASP.NET Core 3.0 onwardsapp.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World!");}).RequireAuthorization(); / / หมายเหตุที่นี่!!!! });
ASP.NET Core รองรับการเพิ่มรูปแบบการรับรองความถูกต้องหลายรูปแบบซึ่งไลบรารีนี้รองรับด้วย เพียงแค่ต้องใช้วิธีการขยายซึ่งใช้ชื่อโครงร่างเป็นพารามิเตอร์ ส่วนที่เหลือก็เหมือนกันทั้งหมด ซึ่งสามารถทำได้หลายวิธี ด้านล่างนี้เป็นเพียงตัวอย่างคร่าวๆ
โปรดทราบว่าพารามิเตอร์ชื่อโครงการสามารถเป็นสตริงใดก็ได้ที่คุณต้องการ
โมฆะสาธารณะ ConfigureServices(บริการ IServiceCollection){services.AddTransient<IUserRepository, InMemoryUserRepository>();services.AddAuthentication("Scheme1").AddBasic<BasicUserValidationService>("Scheme1", options => { options.Realm = "My App"; }).AddBasic<BasicUserValidationService_2>("Scheme2", options => { options.Realm = "My App"; }).AddBasic("Scheme3", options => - options.Realm = "แอปของฉัน"; options.Events = new BasicEvents{OnValidateCredentials = async (บริบท) =>{var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();var user = รอ userRepository.GetUserByUsername(context.Username);var isValid = user ! = null && user.Password == บริบทรหัสผ่าน; ถ้า (isValid){context.Response.Headers.Add("ValidationCustomHeader", "จาก OnValidateCredentials");var การอ้างสิทธิ์ = ใหม่[]{การอ้างสิทธิ์ใหม่ ("CustomClaimType", "ค่าการอ้างสิทธิ์แบบกำหนดเอง - จาก OnValidateCredentials"};context.ValidationSucceeded (การเรียกร้อง); // การอ้างสิทธิ์เป็นทางเลือก}else{context.ValidationFailed();}}}});services.AddControllers();services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder("Scheme1", "Scheme2", " Scheme3").RequireAuthenticatedUser().Build();});}
เวอร์ชัน | หมายเหตุ |
---|---|
8.0.0 |
|
7.0.0 |
|
6.0.1 |
|
5.1.0 |
|
5.0.0 |
|
3.1.1 |
|
3.1.0 |
|
2.2.0 |
|
RFC 7617: ข้อมูลจำเพาะทางเทคนิคสำหรับ HTTP Basic
เอกสารประกอบการรักษาความปลอดภัย ASP.NET Core
แอสเพน/ความปลอดภัย
ใบอนุญาตเอ็มไอที