คุณสามารถบรรลุสิ่งที่คุณต้องการได้ทั้งหมด:
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จนกว่าจะได้ข้อมูลที่ตรงกัน โดยปกติข้อผิดพลาดนี้สามารถละเว้นได้