คุณสามารถบรรลุสิ่งที่คุณต้องการได้ทั้งหมด:
services
.AddAuthentication()
.AddJwtBearer("Firebase", options =>
{
options.Authority = "https://securetoken.google.com/my-firebase-project"
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "my-firebase-project"
ValidateAudience = true,
ValidAudience = "my-firebase-project"
ValidateLifetime = true
};
})
.AddJwtBearer("Custom", options =>
{
});
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
});
มาดูความแตกต่างระหว่างรหัสของคุณกับรหัสนั้น
AddAuthentication
ไม่มีพารามิเตอร์
หากคุณตั้งค่าโครงร่างการรับรองความถูกต้องเริ่มต้นดังนั้นในทุกคำขอเดียวมิดเดิลแวร์การตรวจสอบความถูกต้องจะพยายามเรียกใช้ตัวจัดการการรับรองความถูกต้องที่เกี่ยวข้องกับรูปแบบการพิสูจน์ตัวตนเริ่มต้น เนื่องจากตอนนี้เรามีแผนการตรวจสอบสิทธิ์ที่ยอมรับได้สองแบบจึงไม่มีประโยชน์ในการเรียกใช้หนึ่งในนั้น
ใช้โอเวอร์โหลด AddJwtBearer
ทุกAddXXX
วิธีในการเพิ่มการรับรองความถูกต้องมีหลายโอเวอร์โหลด:
ตอนนี้เนื่องจากคุณใช้วิธีการรับรองความถูกต้องเดียวกันสองครั้ง แต่รูปแบบการตรวจสอบสิทธิ์ต้องไม่ซ้ำกันคุณจึงต้องใช้โอเวอร์โหลดครั้งที่สอง
อัปเดตนโยบายเริ่มต้น
เนื่องจากคำขอจะไม่ได้รับการตรวจสอบสิทธิ์โดยอัตโนมัติอีกต่อไปการใส่[Authorize]
แอตทริบิวต์ในการดำเนินการบางอย่างจะทำให้คำขอถูกปฏิเสธและHTTP 401
จะมีการออก
เนื่องจากนั่นไม่ใช่สิ่งที่เราต้องการเนื่องจากเราต้องการให้ตัวจัดการการตรวจสอบสิทธิ์ในการตรวจสอบสิทธิ์คำขอเราจึงเปลี่ยนนโยบายเริ่มต้นของระบบการให้สิทธิ์โดยระบุว่าควรลองใช้ทั้งแบบแผนFirebase
และCustom
แผนการตรวจสอบสิทธิ์เพื่อพิสูจน์ตัวตนคำขอ
นั่นไม่ได้ป้องกันไม่ให้คุณถูก จำกัด การกระทำบางอย่างมากขึ้น [Authorize]
แอตทริบิวต์มีAuthenticationSchemes
คุณสมบัติที่ช่วยให้คุณสามารถแทนที่ซึ่งแผนการตรวจสอบที่ถูกต้อง
หากคุณมีสถานการณ์ที่ซับซ้อนมากขึ้นคุณสามารถใช้ประโยชน์จากการอนุมัติตามนโยบาย ฉันพบว่าเอกสารอย่างเป็นทางการนั้นดีมาก
สมมติว่าการดำเนินการบางอย่างมีให้เฉพาะโทเค็น JWT ที่ออกโดย Firebase และต้องมีการอ้างสิทธิ์ที่มีค่าเฉพาะ คุณสามารถทำได้ด้วยวิธีนี้:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
จากนั้นคุณสามารถใช้[Authorize(Policy = "FirebaseAdministrators")]
กับการกระทำบางอย่างได้
ประเด็นสุดท้ายที่ควรทราบ: หากคุณกำลังจับAuthenticationFailed
เหตุการณ์และใช้อะไรก็ตามยกเว้นAddJwtBearer
นโยบายแรกคุณอาจเห็นIDX10501: Signature validation failed. Unable to match key...
สิ่งนี้เกิดจากระบบตรวจสอบทีละรายการAddJwtBearer
จนกว่าจะได้ข้อมูลที่ตรงกัน โดยปกติข้อผิดพลาดนี้สามารถละเว้นได้