Asp.Net Core 2 Memvalidasi token pembawa

Saya berjuang untuk menemukan cara yang tepat untuk memvalidasi token OAuth bearer saya yang diteruskan ketika permintaan dikirim ke API yang sedang saya kerjakan yang merupakan proyek Asp.Net core.

Tujuannya di sini adalah untuk mengekstrak token pembawa dan Validate itu dan jika semuanya baik-baik saja maka lanjutkan dengan permintaan.

Sejauh ini temuan saya adalah sebagai berikut

  • JWT menanggung otorisasi token yang sebagian besar berbicara tentang access_token

  • Middleware keamanan inti Asp.Net

  • Atribut Otorisasi Khusus yang menangani ini.

Saya tidak begitu yakin bagaimana saya bisa mencapai validasi saya? Haruskah saya mengekstrak token pembawa dan kemudian membuat metode validasi khusus?

Idealnya ingin atribut [Authorize] menangani ini.

Mohon sarannya?


person KJSR    schedule 09.07.2019    source sumber
comment
Sudahkah Anda mengidentifikasi aliran mana yang ingin Anda gunakan?   -  person Austin T French    schedule 09.07.2019
comment
@AustinTFrench seperti yang disebutkan idealnya ingin menggunakan cara atribut. Namun, bahkan membuat atribut autentikasi khusus di inti asp.net agak terbatas?   -  person KJSR    schedule 09.07.2019
comment
kunci atribut? Jadi hibah spesifik di JWT Anda? Saya akan mempertimbangkan hibah Otorisasi, dan mendapatkan hibah tambahan melalui API. Dan inti .NET tidak terbatas, tetapi telah banyak berubah. Core 2 menggunakan perpustakaan dan metode yang berbeda (bahkan dalam konfigurasi start up) dari 1.0, dan 2.3 mengubahnya lagi. Siapa yang tahu apa yang akan dilakukan Core 3...   -  person Austin T French    schedule 09.07.2019
comment
@AustinTFrench dapatkah Anda menjelaskan lebih lanjut tentang pemberian Otorisasi?   -  person KJSR    schedule 09.07.2019
comment
Ada banyak sekali di luar sana (periksa spesifikasinya atau mulai di oauth.net/2/grant -types/authorization-code ), dan kami akan membahas lebih lanjut dalam komentar   -  person Austin T French    schedule 09.07.2019
comment
@AustinTFrench memeriksa tautan untuk pemberian Otorisasi. Jika saya tidak salah, tetapi itu dialihkan ke server OAuth tempat pengguna menerima permintaan dan otorisasi diberikan. Namun dalam kasus saya, saya memiliki token akses yang memerlukan validasi.   -  person KJSR    schedule 09.07.2019
comment
Saya sekarang sedang mencari developer.okta.com/ blog/2018/03/23/ yang menggunakan JWT   -  person KJSR    schedule 09.07.2019
comment
Mengingat perubahan skenario jwt dan oauth di inti asp.net, pilihan yang aman adalah menggunakan openIdConnect. Itu membuat hidup Anda lebih mudah, dan saat ini adalah bukti masa depan!   -  person Himanshu Pant    schedule 10.07.2019
comment
@HimanshuPant Saya tidak punya pilihan. Saya harus menggunakan token OAuth Bearer seperti JWT atau OpenIdConnect.   -  person KJSR    schedule 10.07.2019


Jawaban (2)


Akhirnya setelah penelitian lebih lanjut saya akhirnya menemukan bahwa custom AuthorizationHandler adalah solusi yang lebih cocok karena misalkan menggunakan atribut custom Authorize yang tidak disarankan di Asp.Net Core.

Pengaturannya mudah dan saya dapat mengekstrak token Bearer saya dari header untuk otorisasi lebih lanjut dengan OAuth.

Inilah pendekatan saya:

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();
    }
}

Terakhir daftarkan handler di Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();
}
person KJSR    schedule 10.07.2019
comment
Menurut docs.microsoft.com/en-us/aspnet/core/security/authorization/ daripada melemparkan pengecualian, lebih baik “ Untuk menjamin kegagalan, bahkan jika penangan persyaratan lain berhasil, panggil konteks.Gagal. ” - person Michael Freidgeim; 08.06.2020

Saya rasa dengan memasukkan cuplikan kode berikut ke dalam ConfigureServices() seharusnya dapat memvalidasi access_token Anda setelah menginstal paket NuGet Microsoft.AspNetCore.Authentication.JwtBearer:

        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();
            });
        });

ingatlah untuk meletakkan app.UseAuthentication() dan app.UseAuthorization() dalam metode Configure(). Dan tambahkan [authorize] ke API pengontrol Anda.

person yfeng    schedule 29.06.2021