Bagikan melalui


Xamarin.Essentials: Pengautentikasi Web

Kelas WebAuthenticator memungkinkan Anda memulai alur berbasis browser yang mendengarkan panggilan balik ke URL tertentu yang terdaftar ke aplikasi.

Gambaran Umum

Banyak aplikasi mengharuskan penambahan autentikasi pengguna, dan ini sering berarti memungkinkan pengguna Anda untuk masuk ke akun Microsoft, Facebook, Google, dan sekarang Apple Sign In yang sudah ada.

Microsoft Authentication Library (MSAL) menyediakan solusi turn-key yang sangat baik untuk menambahkan autentikasi ke aplikasi Anda. Bahkan ada dukungan untuk aplikasi Xamarin dalam paket NuGet klien mereka.

Jika Anda tertarik menggunakan layanan web Anda sendiri untuk autentikasi, Dimungkinkan untuk menggunakan WebAuthenticator untuk menerapkan fungsionalitas sisi klien.

Mengapa menggunakan back end server?

Banyak penyedia autentikasi telah pindah untuk hanya menawarkan alur autentikasi eksplisit atau dua kaki untuk memastikan keamanan yang lebih baik. Ini berarti Anda memerlukan 'rahasia klien' dari penyedia untuk menyelesaikan alur autentikasi. Sayangnya, aplikasi seluler bukanlah tempat yang bagus untuk menyimpan rahasia dan apa pun yang disimpan dalam kode aplikasi seluler, biner, atau sebaliknya umumnya dianggap tidak aman.

Praktik terbaik di sini adalah menggunakan backend web sebagai lapisan tengah antara aplikasi seluler Anda dan penyedia autentikasi.

Penting

Kami sangat menyarankan untuk tidak menggunakan pustaka dan pola autentikasi khusus seluler yang lebih lama yang tidak memanfaatkan backend web dalam alur autentikasi karena kurangnya keamanan yang melekat untuk menyimpan rahasia klien.

Memulai

Untuk mulai menggunakan API ini, baca panduan memulai untuk Xamarin.Essentials memastikan pustaka diinstal dan disiapkan dengan benar di proyek Anda.

Untuk mengakses fungsionalitas WebAuthenticator , diperlukan penyiapan spesifik platform berikut.

Android memerlukan penyiapan Filter Niat untuk menangani URI panggilan balik Anda. Ini mudah dicapai dengan subkelas WebAuthenticatorCallbackActivity kelas:

const string CALLBACK_SCHEME = "myapp";

[Activity(NoHistory = true, LaunchMode = LaunchMode.SingleTop, Exported = true)]
[IntentFilter(new[] { Android.Content.Intent.ActionView },
    Categories = new[] { Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable },
    DataScheme = CALLBACK_SCHEME)]
public class WebAuthenticationCallbackActivity : Xamarin.Essentials.WebAuthenticatorCallbackActivity
{
}

Jika versi Target Android proyek Anda diatur ke Android 11 (R API 30) Anda harus memperbarui Android Manifest dengan kueri yang digunakan dengan persyaratan visibilitas paket baru.

Buka file AndroidManifest.xml di bawah folder Properti dan tambahkan yang berikut ini di dalam node manifes:

<queries>
    <intent>
        <action android:name="android.support.customtabs.action.CustomTabsService" />
    </intent>
</queries>

Menggunakan WebAuthenticator

Tambahkan referensi ke Xamarin.Essentials di kelas Anda:

using Xamarin.Essentials;

API terutama terdiri dari satu metode AuthenticateAsync yang mengambil dua parameter: Url yang harus digunakan untuk memulai alur browser web, dan Uri yang Anda harapkan alurnya pada akhirnya memanggil kembali dan mana aplikasi Anda terdaftar untuk dapat ditangani.

Hasilnya adalah WebAuthenticatorResult yang mencakup parameter kueri apa pun yang diurai dari URI panggilan balik:

var authResult = await WebAuthenticator.AuthenticateAsync(
        new Uri("https://mysite.com/mobileauth/Microsoft"),
        new Uri("myapp://"));

var accessToken = authResult?.AccessToken;

WebAuthenticator API mengurus peluncuran url di browser dan menunggu hingga panggilan balik diterima:

Typical Web Authentication Flow

Jika pengguna membatalkan alur kapan saja, akan TaskCanceledException dilemparkan.

Sesi autentikasi privat

iOS 13 memperkenalkan API browser web sementara bagi pengembang untuk meluncurkan sesi autentikasi sebagai privat. Hal ini memungkinkan pengembang untuk meminta agar tidak ada cookie bersama atau data penjelajahan yang tersedia di antara sesi autentikasi dan akan menjadi sesi masuk baru setiap kali. Ini tersedia melalui yang baru WebAuthenticatorOptions yang diperkenalkan di Xamarin.Essentials 1.7 untuk iOS.

var url = new Uri("https://mysite.com/mobileauth/Microsoft");
var callbackUrl = new Uri("myapp://");
var authResult = await WebAuthenticator.AuthenticateAsync(new WebAuthenticatorOptions
    {
        Url = url,
        CallbackUrl = callbackUrl,
        PrefersEphemeralWebBrowserSession = true
    });

Perbedaan platform

Tab Kustom digunakan setiap kali tersedia, jika tidak, Niat dimulai untuk URL.

Masuk Apple

Menurut pedoman ulasan Apple, jika aplikasi Anda menggunakan layanan masuk sosial apa pun untuk mengautentikasi, aplikasi juga harus menawarkan Masuk Apple sebagai opsi.

Untuk menambahkan Masuk Apple ke app, pertama-tama Anda harus mengonfigurasi app untuk menggunakan Apple Sign In.

Untuk iOS 13 dan yang lebih tinggi, Anda harus memanggil metode .AppleSignInAuthenticator.AuthenticateAsync() Ini akan menggunakan API Masuk Apple asli di bawah tenda sehingga pengguna Anda mendapatkan pengalaman terbaik di perangkat ini. Anda dapat menulis kode bersama untuk menggunakan API yang tepat pada runtime seperti ini:

var scheme = "..."; // Apple, Microsoft, Google, Facebook, etc.
WebAuthenticatorResult r = null;

if (scheme.Equals("Apple")
    && DeviceInfo.Platform == DevicePlatform.iOS
    && DeviceInfo.Version.Major >= 13)
{
    // Use Native Apple Sign In API's
    r = await AppleSignInAuthenticator.AuthenticateAsync();
}
else
{
    // Web Authentication flow
    var authUrl = new Uri(authenticationUrl + scheme);
    var callbackUrl = new Uri("xamarinessentials://");

    r = await WebAuthenticator.AuthenticateAsync(authUrl, callbackUrl);
}

var authToken = string.Empty;
if (r.Properties.TryGetValue("name", out var name) && !string.IsNullOrEmpty(name))
    authToken += $"Name: {name}{Environment.NewLine}";
if (r.Properties.TryGetValue("email", out var email) && !string.IsNullOrEmpty(email))
    authToken += $"Email: {email}{Environment.NewLine}";

// Note that Apple Sign In has an IdToken and not an AccessToken
authToken += r?.AccessToken ?? r?.IdToken;

Tip

Untuk perangkat non-iOS 13, ini akan memulai alur autentikasi web, yang juga dapat digunakan untuk mengaktifkan Masuk Apple di perangkat Android dan UWP Anda. Anda dapat masuk ke akun iCloud di simulator iOS untuk menguji Masuk Apple.


ASP.NET back end server inti

Dimungkinkan WebAuthenticator untuk menggunakan API dengan layanan back end web apa pun. Untuk menggunakannya dengan aplikasi inti ASP.NET, pertama-tama Anda perlu mengonfigurasi aplikasi web dengan langkah-langkah berikut:

  1. Siapkan penyedia autentikasi sosial eksternal yang Anda inginkan di aplikasi web ASP.NET Core.
  2. Atur Skema Autentikasi Default ke CookieAuthenticationDefaults.AuthenticationScheme dalam panggilan Anda .AddAuthentication() .
  3. Gunakan .AddCookie() dalam panggilan Startup.cs .AddAuthentication() Anda.
  4. Semua penyedia harus dikonfigurasi dengan .SaveTokens = true;.
services.AddAuthentication(o =>
    {
        o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddFacebook(fb =>
    {
        fb.AppId = Configuration["FacebookAppId"];
        fb.AppSecret = Configuration["FacebookAppSecret"];
        fb.SaveTokens = true;
    });

Tip

Jika Anda ingin menyertakan Apple Sign In, Anda dapat menggunakan AspNet.Security.OAuth.Apple paket NuGet. Anda dapat melihat sampel Startup.cs lengkap di repositori GitHub Esensial.

Menambahkan pengontrol autentikasi seluler kustom

Dengan alur autentikasi seluler, biasanya diinginkan untuk memulai alur langsung ke penyedia yang telah dipilih pengguna (misalnya dengan mengklik tombol "Microsoft" pada layar masuk aplikasi). Penting juga untuk dapat mengembalikan informasi yang relevan ke aplikasi Anda di URI panggilan balik tertentu untuk mengakhiri alur autentikasi.

Untuk mencapai hal ini, gunakan Pengontrol API kustom:

[Route("mobileauth")]
[ApiController]
public class AuthController : ControllerBase
{
    const string callbackScheme = "myapp";

    [HttpGet("{scheme}")] // eg: Microsoft, Facebook, Apple, etc
    public async Task Get([FromRoute]string scheme)
    {
        // 1. Initiate authentication flow with the scheme (provider)
        // 2. When the provider calls back to this URL
        //    a. Parse out the result
        //    b. Build the app callback URL
        //    c. Redirect back to the app
    }
}

Tujuan pengontrol ini adalah untuk menyimpulkan skema (penyedia) yang diminta aplikasi, dan memulai alur autentikasi dengan penyedia sosial. Ketika penyedia memanggil kembali ke backend web, pengontrol mengurai hasilnya dan mengalihkan ke URI panggilan balik aplikasi dengan parameter.

Terkadang Anda mungkin ingin mengembalikan data seperti penyedia access_token kembali ke aplikasi yang dapat Anda lakukan melalui parameter kueri URI panggilan balik. Atau, Anda mungkin ingin membuat identitas Anda sendiri di server Anda dan meneruskan kembali token Anda sendiri ke aplikasi. Apa dan bagaimana Anda melakukan bagian ini terserah Anda!

Lihat sampel pengontrol lengkap di repositori Essentials.

Catatan

Sampel di atas menunjukkan cara mengembalikan Token Akses dari penyedia autentikasi pihak ke-3 (yaitu: OAuth). Untuk mendapatkan token yang dapat Anda gunakan untuk mengotorisasi permintaan web ke backend web itu sendiri, Anda harus membuat token Anda sendiri di aplikasi web Anda, dan mengembalikannya sebagai gantinya. Gambaran Umum autentikasi ASP.NET Core memiliki informasi lebih lanjut tentang skenario autentikasi tingkat lanjut di ASP.NET Core.


API