Asp.Net Core 2 กำลังตรวจสอบโทเค็นผู้ถือ

ฉันกำลังดิ้นรนเพื่อค้นหาวิธีการที่แน่นอนในการตรวจสอบโทเค็น OAuth bearer ของฉันซึ่งถูกส่งผ่านเมื่อมีการส่งคำขอไปยัง API ที่กำลังทำงานอยู่ ซึ่งเป็นโครงการ Asp.Net core

จุดประสงค์ที่นี่คือเพื่อแยกโทเค็นผู้ถือและ Validate และหากทุกอย่างเรียบร้อยดี ให้ดำเนินการตามคำขอต่อไป

จนถึงตอนนี้การค้นพบของฉันเจอสิ่งต่อไปนี้

  • JWT แบกการอนุญาตโทเค็นซึ่งส่วนใหญ่พูดถึง access_token

  • มิดเดิลแวร์ความปลอดภัยหลัก Asp.Net

  • แอตทริบิวต์การอนุญาตที่กำหนดเองซึ่งจัดการสิ่งนี้

ฉันไม่แน่ใจจริงๆ ว่าฉันจะผ่านการตรวจสอบความถูกต้องได้อย่างไร ฉันควรแยกโทเค็นผู้ถือแล้วสร้างวิธีการตรวจสอบแบบกำหนดเองหรือไม่

ตามหลักการแล้วต้องการให้แอตทริบิวต์ [Authorize] จัดการสิ่งนี้

ข้อเสนอแนะโปรด?


person KJSR    schedule 09.07.2019    source แหล่งที่มา
comment
คุณได้ระบุโฟลว์ที่คุณต้องการใช้แล้วหรือยัง?   -  person Austin T French    schedule 09.07.2019
comment
@AustinTFrench ตามที่กล่าวไว้แล้วอยากจะใช้คุณลักษณะนี้ อย่างไรก็ตามแม้แต่การสร้างแอตทริบิวต์การอนุญาตแบบกำหนดเองในแกน asp.net ก็ค่อนข้างจำกัดใช่ไหม   -  person KJSR    schedule 09.07.2019
comment
รหัสแอตทริบิวต์? เงินช่วยเหลือเฉพาะเจาะจงใน JWT ของคุณเหรอ? ฉันจะพิจารณาการให้สิทธิ์อนุญาต และรับสิทธิ์เพิ่มเติมผ่าน API และ .NET core ก็ไม่จำกัด แม้จะมีการเปลี่ยนแปลงไปมากก็ตาม Core 2 ใช้ไลบรารีและวิธีการที่แตกต่างกัน (แม้ในการกำหนดค่าเริ่มต้น) มากกว่า 1.0 และ 2.3 ก็เปลี่ยนอีกครั้ง ใครจะรู้ว่า Core 3 จะทำอะไร...   -  person Austin T French    schedule 09.07.2019
comment
@AustinTFrench คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับการให้สิทธิ์อนุญาตได้ไหม   -  person KJSR    schedule 09.07.2019
comment
มีมากมาย (ตรวจสอบข้อมูลจำเพาะหรือเริ่มต้นที่ oauth.net/2/grant -types/authorization-code ) และเราจะเจาะลึกลงไปในความคิดเห็น   -  person Austin T French    schedule 09.07.2019
comment
@AustinTFrench ตรวจสอบลิงก์สำหรับการอนุญาต หากฉันไม่ผิด แต่มันเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์ OAuth ซึ่งผู้ใช้ยอมรับคำขอและได้รับการอนุญาตตามนั้น อย่างไรก็ตาม ในกรณีของฉัน ฉันมีโทเค็นการเข้าถึงซึ่งต้องมีการตรวจสอบความถูกต้อง   -  person KJSR    schedule 09.07.2019
comment
ตอนนี้ฉันกำลังดู developer.okta.com/ blog/2018/03/23/ ซึ่งใช้ JWT   -  person KJSR    schedule 09.07.2019
comment
เมื่อพิจารณาถึงสถานการณ์ที่เปลี่ยนแปลงของ jwt และ oauth ใน asp.net core การเดิมพันที่ปลอดภัยคือการใช้ openIdConnect มันทำให้ชีวิตของคุณง่ายขึ้น และในขณะนี้คือข้อพิสูจน์ในอนาคต!   -  person Himanshu Pant    schedule 10.07.2019
comment
@HimanshuPant ฉันไม่มีตัวเลือก ฉันต้องใช้โทเค็น OAuth Bearer เหมือนกับ JWT หรือ OpenIdConnect   -  person KJSR    schedule 10.07.2019


คำตอบ (2)


ในที่สุดหลังจากการวิจัยเพิ่มเติม ในที่สุดฉันก็พบว่า custom AuthorizationHandler เป็นโซลูชันที่เหมาะสมกว่า สมมติว่าใช้แอตทริบิวต์ Authorize ที่กำหนดเองซึ่งไม่แนะนำใน Asp.Net Core

ติดตั้งง่าย และฉันสามารถแยกโทเค็น Bearer ของฉันออกจากส่วนหัวเพื่อขออนุญาตเพิ่มเติมด้วย OAuth ได้

นี่คือแนวทางของฉัน:

public class CustomAuthorizationHandler: IAuthorizationHandler
{
   public Task HandleAsync(AuthorizationHandlerContext context)
   {
       var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
       string authHeader = authFilterCtx.HttpContext.Request.Headers["Authorization"];
       if (authHeader != null && authHeader.Contains("Bearer"))
       {
          var token = authHeader.Replace("Bearer", "");
          // Now token can be used for further authorization
       }

       throw new NotImplementedException();
    }
}

สุดท้ายลงทะเบียนตัวจัดการใน Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();
}
person KJSR    schedule 10.07.2019
comment
ตาม docs.microsoft.com/en-us/aspnet/core/security/authorization/ แทนที่จะโยนข้อยกเว้น จะดีกว่า “ เพื่อรับประกันความล้มเหลว แม้ว่าตัวจัดการข้อกำหนดอื่นจะสำเร็จ ให้เรียก context.Fail ” - person Michael Freidgeim; 08.06.2020

ฉันคิดว่าการใส่ข้อมูลโค้ดต่อไปนี้ไว้ใน ConfigureServices() ควรสามารถตรวจสอบ access_token ของคุณหลังจากติดตั้งแพ็คเกจ Microsoft.AspNetCore.Authentication.JwtBearer NuGet:

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                //options.SaveToken = true;
                options.MetadataAddress = ValidationEndPoint;
                options.RequireHttpsMetadata = true;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    ValidateLifetime = true,
                    ValidateIssuer = true,
                    ValidateAudience = true,

                    ValidIssuer = tokenIssuer,
                    ValidAudiences = new[] { clientId },
                    ValidAudience = null
                };
            });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("MyPolicy", policy =>
            {
                policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
                policy.RequireAuthenticatedUser();
            });
        });

อย่าลืมใส่ app.UseAuthentication() และ app.UseAuthorization() ใน Configure() วิธีการ และเพิ่ม [อนุญาต] ให้กับ API ตัวควบคุมของคุณ

person yfeng    schedule 29.06.2021