Mewujudkan Prinsip Khusus Dengan AspNet.Security.OpenIdConnect.Server (ASP.NET vNext)

Saya menggunakan Visual Studio 2015 Enterprise dan ASP.NET vNext Beta8 untuk membangun titik akhir yang mengeluarkan dan menggunakan token JWT seperti yang dijelaskan secara detail di sini.

Saya berada pada fase proyek saya di mana saya ingin mengizinkan otentikasi pembawa JWT untuk melanjutkan seperti yang dibahas dalam artikel yang disebutkan di atas, tetapi setelah token diautentikasi, saya ingin:

  • Masuk setelah autentikasi JWT berhasil dan periksa berbagai klaimnya.
  • Hidrasi instance cakupan dari objek utama saya (katakanlah IContosoPrincipal) berdasarkan apa yang saya temukan di token.
  • Pastikan bahwa dukungan konkret untuk IContosoPrincipal tercakup dalam permintaan saat ini.
  • Ketergantungan kemudian menyuntikkan IContosoPrincipal ke salah satu pengontrol yang dilindungi token saya.

Saya yakin ini akan melibatkan objek IContosoPrincipal yang tercakup dan saya mungkin bisa mengetahuinya, tapi saya tidak yakin bagaimana cara mencegat otentikasi JWT setelah token berhasil diautentikasi tetapi sebelum pemanggilan pengontrol/tindakan terjadi.

Setiap saran tentang cara melakukan pendekatan ini akan sangat dihargai.


person 42vogons    schedule 03.11.2015    source sumber


Jawaban (1)


Prinsipal/identitas khusus tidak (dan tidak akan) didukung secara resmi di ASP.NET 5. Anda dapat menemukan informasi selengkapnya tentang topik ini: https://github.com/aspnet/Security/issues/323.

Sebaliknya, Anda sangat disarankan untuk menyimpan data yang Anda perlukan sebagai klaim individual, dan memberikan metode ekstensi sekitar ClaimsIdentity/ClaimsPrincipal bila diperlukan (misalnya jika Anda perlu memformat nilai klaim).

FWIW, pola ini banyak digunakan oleh ASP.NET Identity 3 itu sendiri, yang dilengkapi dengan ekstensi bawaan (seperti GetUserName atau GetUserId) yang dapat Anda gunakan dalam kode Anda sendiri:

/// <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
terima kasih atas jawaban yang sangat informatif dan menyeluruh ini. Saya berbohong jika saya mengatakan saya tidak kecewa; ) Jadi izinkan saya mengajukan pertanyaan ini secara berbeda - Saya ingin menyuntikkan ketergantungan sesuatu ke pengontrol saya yang mengetahui ID ID pengguna di token saya (sebenarnya saya memiliki aspek yang melakukan ini tetapi masih DI). Di vNext apa metode yang diterima untuk melakukan ini. Saya mencoba-coba sumber AspNet.Identity tetapi ekstensi pembuatnya segera mulai melakukan sesuatu dengan cookie jadi tidak yakin apakah ini memunculkan repo yang salah. - person 42vogons; 05.11.2015
comment
Untuk itu, disarankan untuk mengambil prinsipal secara langsung dari permintaan HTTP (melalui HttpContext). Jika komponen Anda tidak memiliki akses langsung ke konteks HTTP, Anda dapat memasukkan IHttpContextAccessor sebagai dependensi dan mengakses prinsipal melalui IHttpContextAccessor.HttpContext.User. - person Kévin Chalet; 05.11.2015
comment
hanya perlu diperhatikan bahwa, mulai hari ini, url PrincipalExtensions rusak. Tidak yakin apakah AspNetCore ini yang sebenarnya, karena isinya berbeda - person superjos; 26.07.2016
comment
sepertinya mereka beralih ke penolong yang lebih umum - person superjos; 26.07.2016
comment
@superjos FYI: ekstensi ini telah diganti dengan metode instan pada UserManager dan SignManager (stackoverflow.com/questions/35693239/). - person Kévin Chalet; 26.07.2016