การทำให้หลักการที่กำหนดเองเป็นรูปธรรมด้วย AspNet.Security.OpenIdConnect.Server (ASP.NET vNext)

ฉันใช้ Visual Studio 2015 Enterprise และ ASP.NET vNext Beta8 เพื่อสร้างจุดสิ้นสุดที่ทั้งออกและใช้โทเค็น JWT ตามที่อธิบายไว้ในรายละเอียด ที่นี่

ฉันอยู่ในขั้นตอนในโครงการของฉันซึ่งฉันต้องการอนุญาตให้การรับรองความถูกต้องผู้ถือ JWT ดำเนินการตามที่กล่าวไว้ในบทความที่กล่าวถึงข้างต้น แต่เมื่อโทเค็นได้รับการรับรองความถูกต้องแล้ว ฉันต้องการ:

  • ขั้นตอนหลังจากการรับรองความถูกต้อง JWT สำเร็จ และตรวจสอบการอ้างสิทธิ์ต่างๆ
  • ไฮเดรตอินสแตนซ์ที่กำหนดขอบเขตของวัตถุหลักของฉันเอง (เช่น IContosoPrincipal) ตามสิ่งที่ฉันพบในโทเค็น
  • ตรวจสอบให้แน่ใจว่าคอนกรีตสำรองสำหรับ IContosoPrincipal มีการกำหนดขอบเขตตามคำขอปัจจุบัน
  • การพึ่งพาฉีด IContosoPrincipal ในภายหลังไปยังหนึ่งในคอนโทรลเลอร์ที่มีการป้องกันโทเค็นของฉัน

ฉันแน่ใจว่าสิ่งนี้จะเกี่ยวข้องกับวัตถุ IContosoPrincipal ที่มีขอบเขต และฉันน่าจะเข้าใจส่วนนั้นได้ แต่ฉันไม่แน่ใจว่าจะสกัดกั้นการรับรองความถูกต้อง JWT ได้อย่างไร หลังจาก โทเค็นได้รับการรับรองความถูกต้องสำเร็จ แต่ก่อนที่จะเรียกใช้ตัวควบคุม / การดำเนินการ เกิดขึ้น

คำแนะนำใด ๆ เกี่ยวกับวิธีการแก้ไขปัญหานี้จะได้รับการชื่นชมมาก


person 42vogons    schedule 03.11.2015    source แหล่งที่มา


คำตอบ (1)


หลัก/ข้อมูลประจำตัวที่กำหนดเองไม่ได้รับการสนับสนุนอย่างเป็นทางการใน ASP.NET 5 (และจะไม่ได้รับ) คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้: https://github.com/aspnet/Security/issues/323

ขอแนะนำให้จัดเก็บข้อมูลที่คุณต้องการเป็นการอ้างสิทธิ์แต่ละรายการ และระบุวิธีการขยายประมาณ ClaimsIdentity/ClaimsPrincipal เมื่อจำเป็น (เช่น หากคุณต้องการจัดรูปแบบมูลค่าการอ้างสิทธิ์)

FWIW รูปแบบนี้ถูกใช้อย่างมากโดย ASP.NET Identity 3 เอง ซึ่งมาพร้อมกับส่วนขยายในตัว (เช่น GetUserName หรือ GetUserId) ที่คุณสามารถใช้ในโค้ดของคุณเอง:

/// <summary>
/// Returns the User ID claim value if present otherwise returns null.
/// </summary>
/// <param name="principal">The <see cref="ClaimsPrincipal"/> instance this method extends.</param>
/// <returns>The User ID claim value, or null if the claim is not present.</returns>
/// <remarks>The User ID claim is identified by <see cref="ClaimTypes.NameIdentifier"/>.</remarks>
public static string GetUserId(this ClaimsPrincipal principal)
{
    if (principal == null)
    {
        throw new ArgumentNullException(nameof(principal));
    }
    return principal.FindFirstValue(ClaimTypes.NameIdentifier);
}

https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity/PrincipalExtensions.cs

person Kévin Chalet    schedule 04.11.2015
comment
ขอบคุณสำหรับคำตอบที่ให้ข้อมูลและละเอียดถี่ถ้วนนี้ ฉันคงจะโกหกถ้าฉันบอกว่าฉันไม่ผิดหวัง ) ดังนั้นให้ฉันถามคำถามนี้แตกต่างออกไป - ฉันต้องการพึ่งพาการฉีด บางสิ่ง ลงในคอนโทรลเลอร์ของฉันที่รู้ ID ของ ID ผู้ใช้ในโทเค็นของฉัน (จริงๆ แล้วฉันมีแง่มุมที่กำลังทำเช่นนี้ แต่ก็ยัง ดิ) ใน vNext วิธีใดที่ได้รับการยอมรับในการทำเช่นนี้ ฉันเดินไปรอบๆ ในแหล่งที่มาของ AspNet.Identity แต่ส่วนขยายตัวสร้างของพวกเขาก็เริ่มทำสิ่งต่าง ๆ ด้วยคุกกี้ทันที ดังนั้นจึงไม่แน่ใจว่านี่เป็นการรบกวน repo ที่ผิดหรือไม่ - person 42vogons; 05.11.2015
comment
ด้วยเหตุนี้ แนะนำให้ดึงข้อมูลหลักโดยตรงจากคำขอ HTTP (ผ่าน HttpContext) เมื่อส่วนประกอบของคุณไม่มีการเข้าถึงบริบท HTTP โดยตรง คุณสามารถแทรก IHttpContextAccessor เป็นการขึ้นต่อกันและเข้าถึงตัวการผ่าน IHttpContextAccessor.HttpContext.User - person Kévin Chalet; 05.11.2015
comment
โปรดทราบว่า ณ วันนี้ PrincipalExtensions url ใช้งานไม่ได้ ไม่แน่ใจว่า AspNetCore นี้ใช่หรือไม่ ของจริงเนื่องจากเนื้อหาแตกต่างกัน - person superjos; 26.07.2016
comment
ดูเหมือนว่าพวกเขาหันไปหาผู้ช่วยทั่วไปมากขึ้น - person superjos; 26.07.2016
comment
@superjos FYI: ส่วนขยายเหล่านี้ถูกแทนที่ด้วยวิธีการอินสแตนซ์ใน UserManager และ SignManager (stackoverflow.com/questions/35693239/) - person Kévin Chalet; 26.07.2016