Dela via


Skåp för autentiseringsuppgifter för Windows-appar

Den här artikeln beskriver hur Windows-appar kan använda autentiseringsskåpet för att lagra och hämta autentiseringsuppgifter på ett säkert sätt och flytta dem mellan enheter med användarens Microsoft-konto.

Windows Runtime-API:er (WinRT) för åtkomst till credential Locker är en del av Windows Software Development Kit (SDK). Dessa API:er kan användas i WinUI och andra skrivbordsappar, till exempel WPF och WinForms. Mer information om hur du använder WinRT-API:er i din Windows-skrivbordsapp finns i Anropa Windows Runtime-API:er i skrivbordsappar.

Översikt över exempelscenariot

Du har till exempel en app som ansluter till en tjänst för att få åtkomst till skyddade resurser, till exempel mediefiler eller sociala nätverk. Tjänsten kräver inloggningsinformation för varje användare. Du har byggt in användargränssnittet i din app som hämtar användarnamnet och lösenordet för användaren, som sedan används för att logga in användaren i tjänsten. Med api:et credential Locker kan du lagra användarnamnet och lösenordet för användaren och enkelt hämta dem och logga in användaren automatiskt nästa gång de öppnar appen, oavsett vilken enhet de är på.

Användarautentiseringsuppgifter som lagras i skåpet för autentiseringsuppgifter upphör inte att gälla, påverkas inte av ApplicationData.RoamingStorageQuota och rensas inte på grund av inaktivitet som traditionella roamingdata. Du kan dock bara lagra upp till 20 autentiseringsuppgifter per app i autentiseringsskåpet.

Credential Locker fungerar lite annorlunda för domänkonton. Om det finns autentiseringsuppgifter som lagras med ditt Microsoft-konto och du associerar kontot med ett domänkonto (till exempel det konto som du använder på jobbet) kommer dina autentiseringsuppgifter att flyttas till det domänkontot. Nya autentiseringsuppgifter som läggs till när man är inloggad med domänkontot kommer dock inte att flyttas. Detta säkerställer att privata autentiseringsuppgifter för domänen inte exponeras utanför domänen.

Lagra användarautentiseringsuppgifter

  1. Hämta en referens till autentiseringsskåpet med hjälp av PasswordVault-objektet från namnområdet Windows.Security.Credentials .
  2. Skapa ett PasswordCredential-objekt som innehåller en identifierare för din app, användarnamnet och lösenordet och skicka det till metoden PasswordVault.Add för att lägga till autentiseringsuppgifterna i skåpet.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Hämtar användarautentiseringsuppgifter

Du har flera alternativ för att hämta användarautentiseringsuppgifter från autentiseringsskåpet när du har en referens till PasswordVault-objektet .

  • Du kan hämta alla autentiseringsuppgifter som användaren har angett för din app i lösenordsvalvet med metoden PasswordVault.RetrieveAll .
  • Om du känner till användarnamnet för de lagrade autentiseringsuppgifterna kan du hämta alla autentiseringsuppgifter för användarnamnet med metoden PasswordVault.FindAllByUserName .
  • Om du känner till resursnamnet för de lagrade autentiseringsuppgifterna kan du hämta alla autentiseringsuppgifter för resursnamnet med metoden PasswordVault.FindAllByResource .
  • Om du känner till både användarnamnet och resursnamnet för en autentiseringsuppgift kan du hämta just den autentiseringsuppgiften med metoden PasswordVault.Retrieve .

Nu ska vi titta på ett exempel där vi har lagrat resursnamnet globalt i en app och loggar in användaren automatiskt om vi hittar en autentiseringsuppgift för dem. Om vi hittar flera autentiseringsuppgifter för samma användare ber vi användaren att välja en standardautentiseringsuppgift som ska användas vid inloggning.

private string resourceName = "My App";
private string defaultUserName;

private void Login()
{
    var loginCredential = GetCredentialFromLocker();

    if (loginCredential != null)
    {
        // There is a credential stored in the locker.
        // Populate the Password property of the credential
        // for automatic login.
        loginCredential.RetrievePassword();
    }
    else
    {
        // There is no credential stored in the locker.
        // Display UI to get user credentials.
        loginCredential = GetLoginCredentialUI();
    }

    // Log the user in.
    ServerLogin(loginCredential.UserName, loginCredential.Password);
}

private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
    Windows.Security.Credentials.PasswordCredential credential = null;

    var vault = new Windows.Security.Credentials.PasswordVault();

    IReadOnlyList<PasswordCredential> credentialList = null;

    try
    {
        credentialList = vault.FindAllByResource(resourceName);
    }
    catch(Exception)
    {
        return null;
    }

    if (credentialList.Count > 0)
    {
        if (credentialList.Count == 1)
        {
            credential = credentialList[0];
        }
        else
        {
            // When there are multiple usernames,
            // retrieve the default username. If one doesn't
            // exist, then display UI to have the user select
            // a default username.
            defaultUserName = GetDefaultUserNameUI();

            credential = vault.Retrieve(resourceName, defaultUserName);
        }
    }

    return credential;
}

Ta bort användarautentiseringsuppgifter

Att ta bort användarautentiseringsuppgifter i autentiseringsskåpet är också en snabb tvåstegsprocess.

  1. Hämta en referens till autentiseringsskåpet med hjälp av PasswordVault-objektet från namnområdet Windows.Security.Credentials .
  2. Skicka de autentiseringsuppgifter som du vill ta bort till metoden PasswordVault.Remove .
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Metodtips

Använd endast skåpet för autentiseringsuppgifter för lösenord och inte för större datablobar.

Spara endast lösenord i skåpet för autentiseringsuppgifter om följande villkor uppfylls:

  • Användaren har loggat in.
  • Användaren har valt att spara lösenord.

Lagra aldrig autentiseringsuppgifter i klartext med hjälp av appdata eller roaminginställningar.