การรวม Auth0.NET เข้ากับโปรเจ็กต์ของคุณในขณะที่ปฏิบัติตามแบบแผน .NET ที่เป็นสำนวนอาจเป็นเรื่องยุ่งยากและเกี่ยวข้องกับปริมาณสำเร็จรูปจำนวนมากที่ใช้ร่วมกันระหว่างโปรเจ็กต์
ห้องสมุดนี้หวังที่จะแก้ปัญหาดังกล่าว โดยมีเนื้อหาดังนี้:
ส่วนขยายสำหรับ Microsoft.Extensions.DependencyInjection
การแคชโทเค็นการเข้าถึงอัตโนมัติและการต่ออายุสำหรับ API การจัดการและบริการ REST & Grpc ของคุณเอง
การรวม HttpClientFactory สำหรับการขยายแบบรวมศูนย์และการจัดการตัวจัดการ HTTP ภายใน
ส่วนขยาย IHttpClientBuilder
ที่ให้ตัวจัดการผนวกโทเค็นการเข้าถึงเข้ากับคำขอขาออกโดยอัตโนมัติ
ไลบรารีนี้เข้ากันได้กับรันไทม์ .NET Standard 2.0 ทั้งหมด (แนะนำ .NET 8+) และเหมาะสำหรับใช้ใน ASP.NET Core และแอปพลิเคชัน .NET Generic Host แบบสแตนด์อโลน
เพิ่ม Auth0Net.DependencyInjection
ให้กับโปรเจ็กต์ของคุณ:
Install-Package Auth0Net.DependencyInjection
หากคุณเพียงใช้ AuthenticationApiClient
และไม่มีอย่างอื่น คุณสามารถเรียก AddAuth0AuthenticationClientCore
และส่งผ่านโดเมน Auth0 ของคุณได้ การผสานรวมนี้มีขนาดเล็กและไม่รองรับคุณสมบัติอื่นใดของไลบรารีนี้
services . AddAuth0AuthenticationClientCore ( "your-auth0-domain.auth0.com" ) ;
จากนั้นคุณสามารถขอ IAuthenticationApiClient
ภายในชั้นเรียนของคุณได้:
public class AuthController : ControllerBase
{
private readonly IAuthenticationApiClient _authenticationApiClient ;
public AuthController ( IAuthenticationApiClient authenticationApiClient )
{
_authenticationApiClient = authenticationApiClient ;
}
เพิ่ม AuthenticationApiClient
ด้วย AddAuth0AuthenticationClient
และจัดเตรียมการกำหนดค่าแอปพลิเคชันแบบเครื่องต่อเครื่องที่จะใช้โดยการรวม Management Client, Token Cache และ IHttpClientBuilder ต้อง เรียกส่วนขยายนี้ก่อนใช้ส่วนขยายอื่นภายในไลบรารีนี้:
services . AddAuth0AuthenticationClient ( config =>
{
config . Domain = builder . Configuration [ "Auth0:Domain" ] ;
config . ClientId = builder . Configuration [ "Auth0:ClientId" ] ;
config . ClientSecret = builder . Configuration [ "Auth0:ClientSecret" ] ;
} ) ;
เพิ่ม ManagementApiClient
ด้วย AddAuth0ManagementClient()
และเพิ่ม DelegatingHandler
ด้วย AddManagementAccessToken()
ที่จะแนบโทเค็นการเข้าถึงโดยอัตโนมัติ:
services . AddAuth0ManagementClient ( ) . AddManagementAccessToken ( ) ;
ตรวจสอบให้แน่ใจว่าแอปพลิเคชัน Machine-to-Machine ของคุณได้รับอนุญาตให้ขอโทเค็นจาก Managment API และมีขอบเขตที่ถูกต้องสำหรับคุณสมบัติที่คุณต้องการใช้
จากนั้นคุณสามารถขอ IManagementApiClient
(หรือ IAuthenticationApiClient
) ภายในบริการของคุณได้:
public class MyAuth0Service : IAuth0Service
{
private readonly IManagementApiClient _managementApiClient ;
public MyAuth0Service ( IManagementApiClient managementApiClient )
{
_managementApiClient = managementApiClient ;
}
หากคุณใช้โดเมนที่กำหนดเองกับผู้เช่า Auth0 ของคุณ คุณอาจพบปัญหาที่ตั้งค่า audience
ของ API การจัดการไม่ถูกต้อง คุณสามารถแทนที่สิ่งนี้ได้ผ่านคุณสมบัติ Audience
:
services . AddAuth0ManagementClient ( )
. AddManagementAccessToken ( c =>
{
c . Audience = "my-tenant.au.auth0.com" ;
} ) ;
หมายเหตุ: คุณลักษณะนี้อาศัย services.AddAuth0AuthenticationClient(config => ...)
ที่ถูกเรียกและกำหนดค่าตามที่ระบุไว้ในสถานการณ์ก่อนหน้านี้
ไลบรารีนี้มีตัวจัดการการมอบหมาย ซึ่งเป็นมิดเดิลแวร์ที่มีประสิทธิภาพสำหรับ HttpClient ของคุณ ซึ่งจะผนวกโทเค็นการเข้าถึงเข้ากับคำขอขาออกทั้งหมด สิ่งนี้มีประโยชน์สำหรับการเรียกใช้บริการอื่น ๆ ที่ได้รับการคุ้มครองโดย Auth0 การบูรณาการนี้กำหนดให้ต้องมีการใช้งานบริการของคุณเพื่อใช้ IHttpClientFactory
เป็นส่วนหนึ่งของการลงทะเบียน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่นี่
ใช้ AddAccessToken
ร่วมกับผู้ชมที่ต้องการ:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( builder . Configuration [ "MyHttpService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyHttpService:Audience" ] ) ;
ส่วนขยายนี้เข้ากันได้กับการลงทะเบียนใด ๆ ที่ส่งคืน IHttpClientBuilder
ดังนั้นจึงสามารถใช้กับโรงงานไคลเอนต์ของ Grpc ได้:
services . AddGrpcClient < UserService . UserServiceClient > ( x => x . Address = new Uri ( builder . Configuration [ "MyGrpcService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyGrpcService:Audience" ] ) ;
AddAccessToken
ยังมีตัวเลือกในการส่งผ่าน func ที่สามารถแก้ไขผู้ชม ณ รันไทม์ได้ สิ่งนี้มีประโยชน์หากผู้ชมที่คาดหวังของคุณเป็นไปตามรูปแบบเสมอ หรือหากคุณพึ่งพาการค้นพบบริการ เช่น จาก Steeltoe.NET:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( "https://MyServiceName/" ) )
. AddServiceDiscovery ( )
. AddAccessToken ( config => config . AudienceResolver = request => request . RequestUri . GetLeftPart ( UriPartial . Authority ) ) ;
ทั้งไคลเอนต์การรับรองความถูกต้องและการอนุญาตได้รับการลงทะเบียนเป็นซิงเกิลตันและเหมาะสำหรับการเติมเข้าไปในอายุการใช้งานอื่น ๆ
ทั้งตัวอย่าง .NET Generic Host และ ASP.NET Core มีอยู่ในไดเร็กทอรีตัวอย่าง
Auth0TokenCache
จะแคชโทเค็นสำหรับผู้ชมที่กำหนดจนกระทั่งอย่างน้อย 95% ของเวลาหมดอายุ หากคำขอไปยังแคชเกิดขึ้นระหว่าง 95% ถึง 99% ของการหมดอายุ โทเค็นจะถูกรีเฟรชในพื้นหลังก่อนที่จะถึงวันหมดอายุ
มีการเอาอายุการใช้งานเพิ่มเติม 1% ออกเพื่อป้องกันการเลื่อนของสัญญาณนาฬิการะหว่างระบบแบบกระจาย
ในบางสถานการณ์ คุณอาจต้องการขอโทเค็นการเข้าถึงจาก Auth0 ด้วยตนเอง คุณสามารถบรรลุเป้าหมายนี้ได้โดยการฉีด IAuth0TokenCache
ลงในคลาสและเรียก GetTokenAsync
พร้อมกับผู้ชมของ API ที่คุณขอโทเค็น
อินสแตนซ์ในหน่วยความจำเท่านั้นของ FusionCache จะถูกนำมาใช้เป็นการใช้งานแคช อินสแตนซ์นี้ได้ รับการตั้งชื่อ และจะไม่ส่งผลกระทบต่อการใช้งาน FusionCache อื่นๆ
ไลบรารีนี้เปิดเผยส่วนขยายสตริงแบบง่าย ToHttpsUrl()
ซึ่งสามารถใช้ในการจัดรูปแบบโดเมน Auth0 เปล่าที่อยู่ในการกำหนดค่าของคุณให้เป็น URL ที่เหมาะสม
สิ่งนี้เหมือนกับ https://{Configuration["Auth0:Domain"]}/
ที่ปกติคุณจะเขียน ที่ไหนสักแห่ง ใน Startup.cs
ของคุณ
ตัวอย่างเช่น การจัดรูปแบบโดเมนสำหรับ JWT Authority:
. AddJwtBearer ( options =>
{
// "my-tenant.auth0.com" -> "https://my-tenant.auth0.com/"
options . Authority = builder . Configuration [ "Auth0:Domain" ] . ToHttpsUrl ( ) ;
//...
} ) ;
ฉันไม่มีส่วนเกี่ยวข้องหรือเป็นตัวแทนของ Auth0 ปัญหาการใช้งานทั้งหมดที่เกี่ยวข้องกับ ManagementApiClient
และ AuthenticationApiClient
พื้นฐานควรไปที่ Auth0.NET Respository อย่างเป็นทางการ
ไอคอนที่ใช้ภายใต้ใบอนุญาต MIT จากชุด Identicons