Bagikan melalui


Autentikasi Jarak Jauh

Fitur autentikasi jarak jauh adaptor System.Web memungkinkan aplikasi ASP.NET Core menentukan identitas pengguna (mengautentikasi permintaan HTTP) dengan menukar ke aplikasi ASP.NET. Mengaktifkan fitur menambahkan titik akhir ke aplikasi ASP.NET yang mengembalikan serial ClaimsPrincipal yang mewakili pengguna yang diautentikasi untuk setiap permintaan yang dibuat ke titik akhir. Aplikasi ASP.NET Core, kemudian, mendaftarkan handler autentikasi kustom yang akan (untuk titik akhir dengan autentikasi jarak jauh diaktifkan) menentukan identitas pengguna dengan memanggil titik akhir tersebut di aplikasi ASP.NET dan melewati header yang dipilih dan cookiedari permintaan asli yang diterima oleh aplikasi ASP.NET Core.

Konfigurasi

Hanya ada beberapa perubahan kode kecil yang diperlukan untuk mengaktifkan autentikasi jarak jauh dalam solusi yang sudah disiapkan sesuai dengan Memulai.

Pertama, ikuti instruksi penyiapan aplikasi jarak jauh untuk menyambungkan aplikasi ASP.NET Core dan ASP.NET. Kemudian, hanya ada beberapa metode ekstensi tambahan untuk dipanggil untuk mengaktifkan autentikasi aplikasi jarak jauh.

konfigurasi aplikasi ASP.NET

Aplikasi ASP.NET perlu dikonfigurasi untuk menambahkan titik akhir autentikasi. Menambahkan titik akhir autentikasi dilakukan dengan memanggil AddAuthenticationServer metode ekstensi untuk menyiapkan modul HTTP yang mengawasi permintaan ke titik akhir autentikasi. Perhatikan bahwa skenario autentikasi jarak jauh biasanya juga ingin menambahkan dukungan proksi, sehingga setiap pengalihan terkait autentikasi dirutekan dengan benar ke aplikasi ASP.NET Core daripada yang ASP.NET.

SystemWebAdapterConfiguration.AddSystemWebAdapters(this)
    .AddProxySupport(options => options.UseForwardedHeaders = true)
    .AddRemoteAppServer(options =>
    {
        options.ApiKey = ConfigurationManager.AppSettings["RemoteAppApiKey"];
    })
    .AddAuthenticationServer();

konfigurasi aplikasi ASP.NET Core

Selanjutnya, aplikasi ASP.NET Core perlu dikonfigurasi untuk mengaktifkan handler autentikasi yang akan mengautentikasi pengguna dengan membuat permintaan HTTP ke aplikasi ASP.NET. Sekali lagi, ini dilakukan dengan memanggil AddAuthenticationClient saat mendaftarkan layanan adaptor System.Web:

builder.Services.AddSystemWebAdapters()
    .AddRemoteAppClient(options =>
    {
        options.RemoteAppUrl = new Uri(builder.Configuration
            ["ReverseProxy:Clusters:fallbackCluster:Destinations:fallbackApp:Address"]);
        options.ApiKey = builder.Configuration["RemoteAppApiKey"];
    })
    .AddAuthenticationClient(true);

Boolean yang diteruskan ke AddAuthenticationClient panggilan menentukan apakah autentikasi aplikasi jarak jauh harus menjadi skema autentikasi default. Passing true akan menyebabkan pengguna diautentikasi melalui autentikasi aplikasi jarak jauh untuk semua permintaan, sedangkan passing false berarti bahwa pengguna hanya akan diautentikasi dengan autentikasi aplikasi jarak jauh jika skema aplikasi jarak jauh secara khusus diminta (dengan [Authorize(AuthenticationSchemes = RemoteAppAuthenticationDefaults.AuthenticationScheme)] pada pengontrol atau metode tindakan, misalnya). Meneruskan false untuk parameter ini memiliki keuntungan hanya membuat permintaan HTTP ke aplikasi ASP.NET asli untuk autentikasi untuk titik akhir yang memerlukan autentikasi aplikasi jarak jauh tetapi memiliki kerugian karena memerlukan anotasi semua titik akhir tersebut untuk menunjukkan bahwa mereka akan menggunakan autentikasi aplikasi jarak jauh.

Selain boolean yang diperlukan, panggilan balik opsional dapat diteruskan ke AddAuthenticationClient untuk memodifikasi beberapa aspek lain dari perilaku proses autentikasi jarak jauh:

  • RequestHeadersToForward: Properti ini berisi header yang harus diteruskan dari permintaan saat memanggil API autentikasi. Secara default, satu-satunya header yang diteruskan adalah Authorization dan Cookie. Header tambahan dapat diteruskan dengan menambahkannya ke daftar ini. Atau, jika daftar dihapus (sehingga tidak ada header yang ditentukan), maka semua header akan diteruskan.
  • ResponseHeadersToForward: Properti ini mencantumkan header respons yang harus disebarluaskan kembali dari permintaan autentikasi ke panggilan asli yang meminta autentikasi dalam skenario di mana identitas ditantang. Secara default, ini mencakup Locationheader , Set-Cookie, dan WWW-Authenticate .
  • AuthenticationEndpointPath: Titik akhir pada aplikasi ASP.NET tempat permintaan autentikasi harus dibuat. Ini default ke /systemweb-adapters/authenticate dan harus cocok dengan titik akhir yang ditentukan dalam konfigurasi titik akhir autentikasi ASP.NET.

Terakhir, jika aplikasi ASP.NET Core sebelumnya tidak menyertakan middleware autentikasi, itu perlu diaktifkan (setelah middleware perutean, tetapi sebelum middleware otorisasi):

app.UseAuthentication();

Desain

  1. Ketika permintaan diproses oleh aplikasi ASP.NET Core, jika autentikasi aplikasi jarak jauh adalah skema default atau ditentukan oleh titik akhir permintaan, RemoteAuthenticationAuthHandler akan mencoba mengautentikasi pengguna.
    1. Handler akan membuat permintaan HTTP ke titik akhir autentikasi aplikasi ASP.NET. Ini akan menyalin header yang dikonfigurasi dari permintaan saat ini ke yang baru ini untuk meneruskan data yang relevan dengan autentikasi. Seperti disebutkan di atas, perilaku default adalah menyalin Authorize header dan Cookie . Header kunci API juga ditambahkan untuk tujuan keamanan.
  2. Aplikasi ASP.NET akan melayani permintaan yang dikirim ke titik akhir autentikasi. Selama kunci API cocok, aplikasi ASP.NET akan mengembalikan serial pengguna ClaimsPrincipal saat ini ke dalam isi respons atau akan mengembalikan kode status HTTP (seperti 401 atau 302) dan header respons yang menunjukkan kegagalan.
  3. Saat aplikasi RemoteAuthenticationAuthHandler ASP.NET Core menerima respons dari aplikasi ASP.NET:
    1. Jika ClaimsPrincipal berhasil dikembalikan, handler auth akan mendeserialisasinya dan menggunakannya sebagai identitas pengguna saat ini.
    2. Jika ClaimsPrincipal tidak berhasil dikembalikan, handler akan menyimpan hasilnya dan jika autentikasi ditantang (karena pengguna mengakses sumber daya yang dilindungi, misalnya), respons permintaan akan diperbarui dengan kode status dan header respons yang dipilih dari respons dari titik akhir autentikasi. Ini memungkinkan respons tantangan (seperti mengalihkan ke halaman masuk) untuk disebarkan ke pengguna akhir.
      1. Karena hasil dari titik akhir autentikasi aplikasi ASP.NET dapat mencakup data khusus untuk titik akhir tersebut, pengguna dapat mendaftarkan IRemoteAuthenticationResultProcessor implementasi dengan aplikasi ASP.NET Core yang akan berjalan pada hasil autentikasi apa pun sebelum digunakan. Sebagai contoh, yang bawaan IRemoteAuthenticationResultProcessor adalah RedirectUrlProcessor yang mencari Location header respons yang dikembalikan dari titik akhir autentikasi dan memastikan bahwa mereka mengalihkan kembali ke host aplikasi ASP.NET Core dan bukan aplikasi ASP.NET secara langsung.

Pembatasan yang diketahui

Pendekatan autentikasi jarak jauh ini memiliki beberapa batasan yang diketahui:

  1. Karena autentikasi Windows bergantung pada handel ke identitas Windows, autentikasi Windows tidak didukung oleh fitur ini. Pekerjaan di masa mendatang direncanakan untuk menjelajahi cara kerja autentikasi Windows bersama. Lihat dotnet/systemweb-adapters#246 untuk informasi selengkapnya.
  2. Fitur ini memungkinkan aplikasi ASP.NET Core untuk menggunakan identitas yang diautentikasi oleh aplikasi ASP.NET, tetapi semua tindakan yang terkait dengan pengguna (masuk, pengelogan, dll.) masih perlu dirutekan melalui aplikasi ASP.NET.

Alternatif

Jika autentikasi di aplikasi ASP.NET dilakukan menggunakan Microsoft.OwinCookie Middleware Autentikasi, solusi alternatif untuk berbagi identitas adalah mengonfigurasi aplikasi ASP.NET dan ASP.NET Core sehingga mereka dapat berbagi autentikasi cookie. Berbagi autentikasi cookie memungkinkan:

  • Kedua aplikasi untuk menentukan identitas pengguna dari yang sama cookie.
  • Masuk atau keluar dari satu aplikasi akan memasukkan pengguna atau keluar dari aplikasi lain.

Perhatikan bahwa karena masuk biasanya tergantung pada database tertentu, tidak semua fungsionalitas autentikasi akan berfungsi di kedua aplikasi:

  • Pengguna harus masuk hanya melalui salah satu aplikasi, baik aplikasi ASP.NET atau ASP.NET Core, mana pun yang disiapkan database untuk dikerjakan.
  • Kedua aplikasi dapat melihat identitas dan klaim pengguna.
  • Kedua aplikasi dapat mengeluarkan pengguna.

Detail tentang cara mengonfigurasi berbagi autentikasi cookieantara aplikasi ASP.NET dan ASP.NET Core tersedia dalam cookie berbagi dokumentasi. Sampel berikut dalam repositori GitHub adaptor System.Web menunjukkan autentikasi aplikasi jarak jauh dengan konfigurasi bersama cookie yang memungkinkan kedua aplikasi untuk memasukkan pengguna masuk dan keluar :

Autentikasi berbagi adalah opsi yang baik jika kedua hal berikut ini benar:

  • Aplikasi ASP.NET sudah menggunakan Microsoft.Owincookie autentikasi.
  • Dimungkinkan untuk memperbarui aplikasi ASP.NET dan aplikasi ASP.NET Core untuk menggunakan pengaturan perlindungan data yang cocok. Pengaturan perlindungan data bersama yang cocok mencakup jalur file bersama, cache Redis, atau Azure Blob Storage untuk menyimpan kunci perlindungan data.

Untuk skenario lain, pendekatan autentikasi jarak jauh yang dijelaskan sebelumnya dalam dokumen ini lebih fleksibel dan mungkin lebih cocok.