Mengambil nama klien di IdentityServer4 dan ASP.NET Core

Tabel dbo.Clients di database IdentityServer berisi ClientId dan ClientName, namun meminta token kredensial klien tidak menyertakan nama klien dalam token.

Apakah ada cara untuk mengambil informasi klien dari IdentityServer dengan id klien, atau meminta agar nama klien ditambahkan ke token?


person nullPainter    schedule 15.10.2019    source sumber


Jawaban (2)


Anda dapat menambahkannya secara dinamis menggunakan validator permintaan token khusus :

public class ClaimClientsUpdated : ICustomTokenRequestValidator
{
    public Task ValidateAsync(CustomTokenRequestValidationContext context)
    {
        context.Result.ValidatedRequest.Client.AlwaysSendClientClaims = true;
        context.Result.ValidatedRequest.ClientClaims.Add(new Claim("name", context.Result.ValidatedRequest.Client.ClientName));

       return Task.FromResult(0);
    }
}

Daftar di DI :

services.AddTransient<ICustomTokenRequestValidator, ClaimClientsUpdated>();

Ini akan menambahkan awalan "client_" ke klaim khusus, jadi klaim akan menjadi "client_name": "value" dalam token akses.

person Nan Yu    schedule 15.10.2019

Anda dapat menambahkan informasi tentang klien secara umum dengan menambahkan klaim ke tabel ClientClaims. Misalnya. Type = Name, Value = MyCustomName

Yang ditambahkan sebagai klaim (dengan asumsi awalan client_):

"client_Name": "MyCustomName"

Ini memungkinkan Anda menambahkan informasi tentang klien tanpa harus menambah atau mengubah kode.

Kelemahan nama klien adalah Anda harus menambahkan klaim dengan informasi yang berlebihan, karena Clients.ClientName bukan sumbernya. Kelebihannya hanya konfigurasinya saja.

person Ruard van Elburg    schedule 15.10.2019
comment
Terima kasih! Ini adalah pendekatan tujuan umum yang ampuh, tapi saya rasa saya mendekati validator @ nan-yu, hanya untuk menghindari dua sumber kebenaran. - person nullPainter; 15.10.2019
comment
@nullPainter Tidak apa-apa. Saya hanya ingin menyebutkan alternatif ini agar Anda mengetahuinya. Di sisi lain, Anda hanya perlu menyetelnya satu kali. Kemungkinan besar nilainya tidak akan berubah karena digunakan sebagai kunci. - person Ruard van Elburg; 15.10.2019