ดังนั้นหลังจากพยายามแก้ปัญหานี้มาทั้งวันในที่สุดฉันก็พบว่า Microsoft ต้องการให้เราสร้างตัวจัดการการรับรองความถูกต้องแบบกำหนดเองสำหรับการตั้งค่ามิดเดิลแวร์เดี่ยวใหม่ใน core 2.0
หลังจากดูเอกสารบางส่วนใน MSDN ฉันพบคลาสที่เรียกAuthenticationHandler<TOption>
ว่าใช้IAuthenticationHandler
อินเทอร์เฟซ
จากนั้นฉันพบโค้ดเบสทั้งหมดที่มีรูปแบบการตรวจสอบสิทธิ์ที่มีอยู่ที่https://github.com/aspnet/Security
ภายในหนึ่งในนั้นแสดงให้เห็นว่า Microsoft ใช้รูปแบบการรับรองความถูกต้อง JwtBearer อย่างไร ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )
JwtBearer
ผมคัดลอกที่สุดของรหัสว่ากว่าลงในโฟลเดอร์ใหม่และออกมาเคลียร์ทุกสิ่งที่ต้องทำอย่างไรกับ
ในJwtBearerHandler
ชั้นเรียน (ซึ่งขยายออกไปAuthenticationHandler<>
) มีการแทนที่สำหรับTask<AuthenticateResult> HandleAuthenticateAsync()
ฉันได้เพิ่มมิดเดิลแวร์เก่าของเราสำหรับการตั้งค่าการอ้างสิทธิ์ผ่านเซิร์ฟเวอร์โทเค็นที่กำหนดเองและยังคงพบปัญหาบางอย่างเกี่ยวกับสิทธิ์เพียงแค่พ่น a 200 OK
แทน401 Unauthorized
เมื่อโทเค็นไม่ถูกต้องและไม่มีการตั้งค่าการอ้างสิทธิ์
ฉันตระหนักว่าฉันได้ลบล้างTask HandleChallengeAsync(AuthenticationProperties properties)
ซึ่งใช้ในการตั้งค่าการอนุญาตผ่าน[Authorize(Roles="")]
ตัวควบคุมด้วยเหตุผลใดก็ตาม
หลังจากลบการลบล้างนี้โค้ดก็ใช้งานได้และประสบความสำเร็จในการโยน401
เมื่อสิทธิ์ไม่ตรงกัน
Takeaway ที่หลักจากนี้คือว่าตอนนี้คุณไม่สามารถใช้ตัวกลางที่กำหนดเองคุณต้องใช้มันผ่านAuthenticationHandler<>
และคุณจะต้องตั้งค่าDefaultAuthenticateScheme
และเมื่อใช้DefaultChallengeScheme
services.AddAuthentication(...)
นี่คือตัวอย่างของสิ่งนี้ทั้งหมดควรมีลักษณะดังนี้:
ใน Startup.cs / ConfigureServices () เพิ่ม:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "Custom Scheme";
options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });
ใน Startup.cs / Configure () เพิ่ม:
app.UseAuthentication();
สร้างไฟล์ใหม่ CustomAuthExtensions.cs
public static class CustomAuthExtensions
{
public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
{
return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
}
}
สร้างไฟล์ใหม่ CustomAuthOptions.cs
public class CustomAuthOptions: AuthenticationSchemeOptions
{
public CustomAuthOptions()
{
}
}
สร้างไฟล์ใหม่ CustomAuthHandler.cs
internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
return AuthenticateResult.NoResult();
}
}