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.
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.
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";
...
}
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";
...
}
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";
...
}
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();
}
}
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);
}
}
}
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);
}
}
K použití knihovny MSAL na Univerzální platforma Windows není potřeba žádné další nastavení.
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: