Ověřování uživatelů pomocí Azure Active Directory B2C
Azure Active Directory B2C poskytuje správu cloudových identit pro webové a mobilní aplikace přístupné uživatelům. Tento článek ukazuje, jak pomocí Azure Active Directory B2C integrovat správu identit do mobilní aplikace s knihovnou Microsoft Authentication Library.
Přehled
Azure Active Directory B2C (ADB2C) je služba správy identit pro aplikace určené pro uživatele. Umožňuje uživatelům přihlásit se k aplikaci pomocí stávajících sociálních účtů nebo vlastních přihlašovacích údajů, jako je e-mail nebo uživatelské jméno a heslo. Vlastní účty přihlašovacích údajů se označují jako místní účty.
Proces integrace služby Azure Active Directory B2C pro správu identit do mobilní aplikace je následující:
- Vytvořte tenanta Azure Active Directory B2C.
- Zaregistrujte mobilní aplikaci v tenantovi Azure Active Directory B2C.
- Vytvořte zásady pro registraci a přihlášení a zapomněli jste toky uživatelů hesel.
- Pomocí knihovny MSAL (Microsoft Authentication Library) spusťte pracovní postup ověřování s vaším tenantem Azure Active Directory B2C.
Poznámka:
Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
Azure Active Directory B2C podporuje několik zprostředkovatelů identity, včetně Microsoftu, GitHubu, Facebooku, Twitteru a dalších. Další informace o možnostech Azure Active Directory B2C najdete v dokumentaci k Azure Active Directory B2C.
Microsoft Authentication Library podporuje více aplikačních architektur a platforem. Informace o možnostech MSAL najdete v tématu Microsoft Authentication Library na GitHubu.
Konfigurace tenanta Azure Active Directory B2C
Pokud chcete spustit ukázkový projekt, musíte vytvořit tenanta Azure Active Directory B2C. Další informace najdete v tématu Vytvoření tenanta Azure Active Directory B2C na webu Azure Portal.
Po vytvoření tenanta budete potřebovat název tenanta a ID tenanta ke konfiguraci mobilní aplikace. ID a název tenanta jsou definovány doménou vygenerovanou při vytváření adresy URL tenanta. Pokud je vygenerovaná adresa URL https://contoso20190410tenant.onmicrosoft.com/
tenanta ID contoso20190410tenant.onmicrosoft.com
tenanta a název tenanta je contoso20190410tenant
. Na webu Azure Portal najděte doménu tenanta kliknutím na filtr adresáře a předplatného v horní nabídce. Následující snímek obrazovky ukazuje tlačítko filtru adresáře a předplatného Azure a doménu tenanta:
V ukázkovém projektu upravte soubor Constants.cs a nastavte poletenantName
.tenantId
Následující kód ukazuje, jak by se tyto hodnoty měly nastavit, pokud je https://contoso20190410tenant.onmicrosoft.com/
doména vašeho tenanta , nahraďte tyto hodnoty hodnotami z portálu:
public static class Constants
{
static readonly string tenantName = "contoso20190410tenant";
static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
...
}
Registrace mobilní aplikace v Azure Active Directory B2C
Aby bylo možné připojit a ověřit uživatele, musí být mobilní aplikace zaregistrovaná v tenantovi. Proces registrace přiřadí aplikaci jedinečné ID aplikace a adresu URL přesměrování, která po ověření přesměruje odpovědi zpět do aplikace. Další informace najdete v tématu Azure Active Directory B2C: Registrace aplikace. Budete muset znát ID aplikace přiřazené k vaší aplikaci, které je uvedeno za názvem aplikace v zobrazení vlastností. Následující snímek obrazovky ukazuje, kde najít ID aplikace:
Microsoft Authentication Library očekává , že adresa URL pro přesměrování vaší aplikace bude id vaší aplikace s předponou "msal" a za ním koncový bod s názvem "auth". Pokud je VAŠE ID aplikace 1234abcd, měla by být msal1234abcd://auth
úplná adresa URL . Ujistěte se, že vaše aplikace povolila nastavení nativního klienta , a vytvořte vlastní identifikátor URI přesměrování pomocí ID vaší aplikace, jak je znázorněno na následujícím snímku obrazovky:
Adresa URL se použije později v ApplicationManifest.xml Androidu i v souboru iOS Info.plist.
V ukázkovém projektu upravte soubor Constants.cs a nastavte clientId
pole na ID aplikace. Následující kód ukazuje, jak by tato hodnota měla být nastavena, pokud je 1234abcd
VAŠE ID aplikace:
public static class Constants
{
static readonly string tenantName = "contoso20190410tenant";
static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
static readonly string clientId = "1234abcd";
...
}
Vytvoření zásad registrace a přihlašování a zapomenuté zásady hesel
Zásady představují prostředí, které uživatelé provedou dokončením úlohy, jako je vytvoření účtu nebo resetování hesla. Zásada také určuje obsah tokenů, které aplikace obdrží, když se uživatel vrátí z prostředí. Musíte nastavit zásady pro registraci účtu i přihlášení a resetování hesla. Azure má integrované zásady, které zjednodušují vytváření běžných zásad. Další informace najdete v tématu Azure Active Directory B2C: Předdefinované zásady.
Po dokončení nastavení zásad byste měli mít dvě zásady v zobrazení Toky uživatelů (zásady) na webu Azure Portal. Následující snímek obrazovky ukazuje dvě nakonfigurované zásady na webu Azure Portal:
V ukázkovém projektu upravte soubor Constants.cs a nastavte policySignin
pole tak policyPassword
, aby odrážela názvy, které jste zvolili při nastavování zásad:
public static class Constants
{
static readonly string tenantName = "contoso20190410tenant";
static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
static readonly string clientId = "1234abcd";
static readonly string policySignin = "B2C_1_signupsignin1";
static readonly string policyPassword = "B2C_1_passwordreset";
...
}
K ověřování použijte knihovnu MSAL (Microsoft Authentication Library).
Balíček NuGet knihovny Microsoft Authentication Library (MSAL) musí být přidán do sdíleného projektu .NET Standard a projektů platformy v Xamarin.Forms řešení. MSAL obsahuje PublicClientApplicationBuilder
třídu, která vytváří objekt, který dodržuje IPublicClientApplication
rozhraní. MSAL využívá With
klauzule k poskytnutí dalších parametrů konstruktoru a metod ověřování.
V ukázkovém projektu kód pro App.xaml definuje statické vlastnosti pojmenované AuthenticationClient
a UIParent
vytvoří instanci AuthenticationClient
objektu v konstruktoru. Klauzule WithIosKeychainSecurityGroup
poskytuje název skupiny zabezpečení pro aplikace pro iOS. Klauzule WithB2CAuthority
poskytuje výchozí autoritu nebo zásady, které se použijí k ověřování uživatelů. Klauzule WithRedirectUri
říká instanci Azure Notification Hubs, která identifikátor URI přesměrování se má použít, pokud je zadáno více identifikátorů URI. Následující příklad ukazuje, jak vytvořit instanci PublicClientApplication
:
public partial class App : Application
{
public static IPublicClientApplication AuthenticationClient { get; private set; }
public static object UIParent { get; set; } = null;
public App()
{
InitializeComponent();
AuthenticationClient = PublicClientApplicationBuilder.Create(Constants.ClientId)
.WithIosKeychainSecurityGroup(Constants.IosKeychainSecurityGroups)
.WithB2CAuthority(Constants.AuthoritySignin)
.WithRedirectUri($"msal{Constants.ClientId}://auth")
.Build();
MainPage = new NavigationPage(new LoginPage());
}
...
Poznámka:
Pokud má vaše instance Azure Notification Hubs definovaný jenom jeden identifikátor URI přesměrování, může instance fungovat bez AuthenticationClient
zadání identifikátoru WithRedirectUri
URI přesměrování s klauzulí. Tuto hodnotu byste ale měli vždy zadat v případě, že se vaše konfigurace Azure rozšíří tak, aby podporovala jiné klienty nebo metody ověřování.
Obslužná rutina OnAppearing
události v kódu LoginPage.xaml.cs za voláními AcquireTokenSilentAsync
pro aktualizaci ověřovacího tokenu pro uživatele, kteří se přihlásili dříve. Proces ověřování se přesměruje na LogoutPage
úspěšné ověření a neprovede nic při selhání. Následující příklad ukazuje proces tichého opětovného ověření v OnAppearing
:
public partial class LoginPage : ContentPage
{
...
protected override async void OnAppearing()
{
try
{
// Look for existing account
IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();
AuthenticationResult result = await App.AuthenticationClient
.AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault())
.ExecuteAsync();
await Navigation.PushAsync(new LogoutPage(result));
}
catch
{
// Do nothing - the user isn't logged in
}
base.OnAppearing();
}
...
}
Obslužná rutina OnLoginButtonClicked
události (aktivována při kliknutí na tlačítko Přihlásit) volání AcquireTokenAsync
. Knihovna MSAL automaticky otevře prohlížeč mobilního zařízení a přejde na přihlašovací stránku. Přihlašovací adresa URL, označovaná jako Autorita, je kombinací názvu tenanta a zásad definovaných v souboru Constants.cs . Pokud uživatel zvolí možnost zapomenutého hesla, vrátí se do aplikace s výjimkou, která spustí zapomenuté heslo. Následující příklad ukazuje proces ověřování:
public partial class LoginPage : ContentPage
{
...
async void OnLoginButtonClicked(object sender, EventArgs e)
{
AuthenticationResult result;
try
{
result = await App.AuthenticationClient
.AcquireTokenInteractive(Constants.Scopes)
.WithPrompt(Prompt.SelectAccount)
.WithParentActivityOrWindow(App.UIParent)
.ExecuteAsync();
await Navigation.PushAsync(new LogoutPage(result));
}
catch (MsalException ex)
{
if (ex.Message != null && ex.Message.Contains("AADB2C90118"))
{
result = await OnForgotPassword();
await Navigation.PushAsync(new LogoutPage(result));
}
else if (ex.ErrorCode != "authentication_canceled")
{
await DisplayAlert("An error has occurred", "Exception message: " + ex.Message, "Dismiss");
}
}
}
...
}
Metoda OnForgotPassword
se podobá procesu přihlašování, ale implementuje vlastní zásadu. OnForgotPassword
používá jiné přetížení AcquireTokenAsync
, což umožňuje poskytnout konkrétní autoritu. Následující příklad ukazuje, jak zadat vlastní autoritu při získání tokenu:
public partial class LoginPage : ContentPage
{
...
async Task<AuthenticationResult> OnForgotPassword()
{
try
{
return await App.AuthenticationClient
.AcquireTokenInteractive(Constants.Scopes)
.WithPrompt(Prompt.SelectAccount)
.WithParentActivityOrWindow(App.UIParent)
.WithB2CAuthority(Constants.AuthorityPasswordReset)
.ExecuteAsync();
}
catch (MsalException)
{
// Do nothing - ErrorCode will be displayed in OnLoginButtonClicked
return null;
}
}
}
Posledním procesem ověřování je proces odhlášení. Metoda OnLogoutButtonClicked
se volá, když uživatel stiskne tlačítko odhlásit se. Prochází všechny účty a zajišťuje, že jejich tokeny byly zneplatněny. Následující ukázka ukazuje implementaci odhlášení:
public partial class LogoutPage : ContentPage
{
...
async void OnLogoutButtonClicked(object sender, EventArgs e)
{
IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();
while (accounts.Any())
{
await App.AuthenticationClient.RemoveAsync(accounts.First());
accounts = await App.AuthenticationClient.GetAccountsAsync();
}
await Navigation.PopAsync();
}
}
iOS
V iOSu musí být vlastní schéma adres URL zaregistrované v Azure Active Directory B2C zaregistrované v souboru Info.plist. MSAL očekává, že schéma adres URL bude dodržovat konkrétní vzor popsaný dříve v části Registrace mobilní aplikace v Azure Active Directory B2C. Následující snímek obrazovky ukazuje vlastní schéma adres URL v souboru Info.plist.
MsAL také vyžaduje oprávnění řetězce klíčů v iOSu zaregistrované v souboru Entityilements.plist, jak je znázorněno na následujícím snímku obrazovky:
Když Azure Active Directory B2C dokončí žádost o autorizaci, přesměruje se na zaregistrovanou adresu URL přesměrování. Vlastní schéma adres URL vede ke spuštění mobilní aplikace v iOSu a předání adresy URL jako spouštěcího parametru, kde je zpracováno přepsáním OpenUrl
třídy aplikace AppDelegate
a vrací kontrolu nad prostředím knihovny MSAL. Implementace OpenUrl
je znázorněna v následujícím příkladu kódu:
using Microsoft.Identity.Client;
namespace TodoAzure.iOS
{
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
...
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
return base.OpenUrl(app, url, options);
}
}
}
Android
V Androidu musí být v AndroidManifest.xml zaregistrované vlastní schéma adres URL zaregistrované v Azure Active Directory B2C. MSAL očekává, že schéma adres URL bude dodržovat konkrétní vzor popsaný dříve v části Registrace mobilní aplikace v Azure Active Directory B2C. Následující příklad ukazuje vlastní schéma adres URL v AndroidManifest.xml.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.xamarin.adb2cauthorization">
<uses-sdk android:minSdkVersion="15" />
<application android:label="ADB2CAuthorization">
<activity android:name="microsoft.identity.client.BrowserTabActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- example -->
<!-- <data android:scheme="msalaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" android:host="auth" /> -->
<data android:scheme="INSERT_URI_SCHEME_HERE" android:host="auth" />
</intent-filter>
</activity>"
</application>
</manifest>
Třída musí být změněna MainActivity
tak, aby poskytovala UIParent
objekt aplikaci během OnCreate
volání. Když Azure Active Directory B2C dokončí žádost o autorizaci, přesměruje se z AndroidManifest.xml do registrovaného schématu adres URL. Registrované schéma identifikátoru URI vede k volání OnActivityResult
metody s adresou URL jako spouštěcí parametr, kde je zpracován metodou SetAuthenticationContinuationEventArgs
.
public class MainActivity : FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
Forms.Init(this, bundle);
LoadApplication(new App());
App.UIParent = this;
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}
}
Univerzální platforma Windows
K použití knihovny MSAL na Univerzální platforma Windows není potřeba žádné další nastavení.
Spuštění projektu
Spusťte aplikaci na virtuálním nebo fyzickém zařízení. Klepnutím na tlačítko Přihlásit by se měl otevřít prohlížeč a přejít na stránku, kde se můžete přihlásit nebo vytvořit účet. Po dokončení procesu přihlášení byste měli být vráceni na stránku odhlášení aplikace. Následující snímek obrazovky ukazuje přihlašovací obrazovku uživatele spuštěnou v Androidu a iOSu: