Delen via


Verificatie afhandelen

Verificatietypen

Een extensie kan een of meer soorten verificatie ondersteunen. Elk verificatietype is een ander type referentie. De gebruikersinterface voor verificatie die wordt weergegeven aan eindgebruikers in Power Query, wordt aangestuurd door het type referenties dat door een extensie wordt ondersteund.

De lijst met ondersteunde verificatietypen wordt gedefinieerd als onderdeel van de definitie gegevensbrontype van een extensie. Elke verificatiewaarde is een record met specifieke velden. De volgende tabel bevat de verwachte velden voor elk type. Alle velden zijn vereist, tenzij anders gemarkeerd.

Verificatietype Veld Description
Anoniem Het verificatietype Anoniem (ook wel Implicitgenoemd) heeft geen velden.
OAuth Login Starten Functie die de URL en statusinformatie biedt voor het starten van een OAuth-stroom.

Ga naar de sectie Een OAuth-stroom implementeren .
FinishLogin Functie waarmee de access_token en andere eigenschappen worden geëxtraheerd die betrekking hebben op de OAuth-stroom.
Opfrissen (optioneel) Functie waarmee een nieuw toegangstoken wordt opgehaald uit een vernieuwingstoken.
Afmelden (optioneel) Functie die het huidige toegangstoken van de gebruiker ongeldig maakt.
Etiket (optioneel) Een tekstwaarde waarmee u het standaardlabel voor dit AuthenticationKind kunt overschrijven.
Aad AuthorizationUri text waarde of unaire functie die het Microsoft Entra ID-autorisatie-eindpunt retourneert (bijvoorbeeld: "https://login.microsoftonline.com/common/oauth2/authorize").

Ga naar de sectie Microsoft Entra ID-verificatie .
Hulpbron text waarde of unaire functie die de Microsoft Entra ID-resourcewaarde voor uw service retourneert.
Scope (optioneel)text waarde of unire functie die de lijst met bereiken retourneert die als onderdeel van het authenticatieproces moeten worden aangevraagd. Meerdere bereikwaarden moeten worden gescheiden door een spatie. De bereikwaarde moet de naam van het bereik zijn, zonder een Application ID URI (bijvoorbeeld: Data.Read). Wanneer dit niet is opgegeven, wordt het user_impersonation bereik aangevraagd.
GebruikersnaamWachtwoord GebruikersnaamLabel (optioneel) Een tekstwaarde voor het vervangen van het standaardlabel voor het tekstvak Gebruikersnaam in de gebruikersinterface voor referenties.
WachtwoordLabel (optioneel) Een tekstwaarde die het standaardlabel voor het tekstvak Wachtwoord in de gebruikersinterface voor referenties vervangt.
Etiket (optioneel) Een tekstwaarde waarmee u het standaardlabel voor dit AuthenticationKind kunt overschrijven.
Windows Gebruikersnaam Label (optioneel) Een tekstwaarde voor het vervangen van het standaardlabel voor het tekstvak Gebruikersnaam in de gebruikersinterface voor referenties.
WachtwoordLabel (optioneel) Een tekstwaarde die het standaardlabel voor het tekstvak Wachtwoord in de gebruikersinterface voor referenties vervangt.
Etiket (optioneel) Een tekstwaarde waarmee u het standaardlabel voor dit AuthenticationKind kunt overschrijven.
Key KeyLabel (optioneel) Een tekstwaarde die het standaardlabel voor het tekstvak API-sleutel in de gebruikersinterface van referenties vervangt.
Etiket (optioneel) Een tekstwaarde waarmee u het standaardlabel voor dit AuthenticationKind kunt overschrijven.

In het volgende voorbeeld ziet u de authenticatierecord voor een connector die ondersteuning biedt voor OAuth-, Sleutel-, Windows-, Basic- (gebruikersnaam en wachtwoord), en anonieme inloggegevens.

Example:

Authentication = [
    OAuth = [
        StartLogin = StartLogin,
        FinishLogin = FinishLogin,
        Refresh = Refresh,
        Logout = Logout
    ],
    Key = [],
    UsernamePassword = [],
    Windows = [],
    Anonymous = []
]

Toegang tot de huidige inloggegevens

De huidige referenties kunnen worden opgehaald met behulp van de Extension.CurrentCredential functie.

M-gegevensbronfuncties die zijn ingeschakeld voor uitbreidbaarheid nemen automatisch het referentiebereik van uw extensie over. In de meeste gevallen hoeft u niet expliciet toegang te krijgen tot de huidige referenties, maar er zijn uitzonderingen, zoals:

  • Geef de referentie door in een aangepaste header- of querytekenreeksparameter (bijvoorbeeld wanneer u het verificatietype API-sleutel gebruikt).
  • Verbindingsreekseigenschappen instellen voor ODBC- of ADO.NET-extensies.
  • Aangepaste eigenschappen controleren op een OAuth-token.
  • Gebruik de inloggegevens als onderdeel van een OAuth v1-autoriseringsstroom.

De Extension.CurrentCredential functie retourneert een recordobject. De velden die het bevat, zijn verificatietypespecifiek. De volgende tabel bevat details.

Veld Description Gebruikt door
AuthenticationKind Bevat de naam van het verificatietype dat is toegewezen aan deze referentie (UsernamePassword, OAuth, enzovoort). All
Gebruikersnaam Gebruikersnaamwaarde GebruikersnaamWachtwoord, Windows
Wachtwoord Wachtwoordwaarde. Wordt meestal gebruikt met UsernamePassword, maar deze is ook ingesteld voor Sleutel. Sleutel, GebruikersnaamWachtwoord, Windows
access_token OAuth-toegangstokenwaarde. OAuth
Eigenschappen Een record met andere aangepaste eigenschappen voor een bepaalde referentie. Meestal gebruikt met OAuth om andere eigenschappen (zoals de refresh_token) op te slaan die tijdens de verificatiestroom worden geretourneerd met de access_token. OAuth
Key De API-sleutelwaarde. De sleutelwaarde is ook beschikbaar in het veld Wachtwoord. De mashup-engine voegt deze sleutel standaard in een autorisatieheader in alsof deze waarde een basisverificatiewachtwoord is (zonder gebruikersnaam). Als dit type gedrag niet is wat u wilt, moet u de optie ManualCredentials = true opgeven in de optiesrecord. Key
EncryptConnection Een logische waarde die bepaalt of er een versleutelde verbinding met de gegevensbron moet worden vereist. Deze waarde is beschikbaar voor alle verificatietypen, maar wordt alleen ingesteld als EncryptConnection is opgegeven in de definitie van de gegevensbron . All

Het volgende codevoorbeeld krijgt toegang tot de huidige referentie voor een API-sleutel en gebruikt deze om een aangepaste header (x-APIKey) in te vullen.

Example:

MyConnector.Raw = (_url as text) as binary =>
let
    apiKey = Extension.CurrentCredential()[Key],
    headers = [

        #"x-APIKey" = apiKey,
        Accept = "application/vnd.api+json",
        #"Content-Type" = "application/json"
    ],
    request = Web.Contents(_url, [ Headers = headers, ManualCredentials = true ])
in
    request

Een OAuth-stroom implementeren

Met het verificatietype OAuth kan een extensie aangepaste logica voor hun service implementeren. Hiervoor biedt een extensie functies voor StartLogin (retourneert de autorisatie-URI om de OAuth-stroom te initiëren) en FinishLogin (de autorisatiecode voor een toegangstoken uitwisselen). Extensies kunnen optioneel ook functies implementeren zoals Refresh (het uitwisselen van een vernieuwingstoken voor een nieuw toegangstoken) en Logout (het laten verlopen van de huidige vernieuwings- en toegangstokens).

Opmerking

Power Query-extensies worden geëvalueerd in toepassingen die worden uitgevoerd op clientcomputers. Gegevensconnectors mogen geen vertrouwelijke geheimen in hun OAuth-stromen gebruiken, omdat gebruikers de extensie of het netwerkverkeer kunnen inspecteren om het geheim te leren kennen. Ga naar Proof Key for Code Exchange by OAuth Public Clients RFC (ook wel PKCE genoemd) voor meer informatie over het verstrekken van stromen die niet afhankelijk zijn van gedeelde geheimen. Een voorbeeld van deze stroom is te vinden op onze GitHub-site.

Er zijn twee sets OAuth-functiehandtekeningen: de oorspronkelijke handtekening met een minimaal aantal parameters en een geavanceerde handtekening die meer parameters accepteert. De meeste OAuth-stromen kunnen worden geïmplementeerd met behulp van de oorspronkelijke handtekeningen. U kunt ook handtekeningtypen combineren en vergelijken in uw implementatie. Functie-aanroepen worden gematcht op basis van het aantal parameters en hun typen. Er wordt geen rekening gehouden met de parameternamen.

Ga naar het GitHub-voorbeeld voor meer informatie.

Oorspronkelijke OAuth-handtekeningen

StartLogin = (dataSourcePath, state, display) => ...;

FinishLogin = (context, callbackUri, state) => ...;

Refresh = (dataSourcePath, refreshToken) =>  ...;

Logout = (accessToken) => ...;

Geavanceerde OAuth-handtekeningen

Opmerkingen over de geavanceerde handtekeningen:

  • Alle handtekeningen accepteren een clientApplication recordwaarde, die is gereserveerd voor toekomstig gebruik.
  • Alle handtekeningen accepteren een dataSourcePath (in de meeste voorbeelden ook wel resourceUrl genoemd).
  • De Refresh functie accepteert een oldCredential parameter, de vorige record geretourneerd door uw FinishLogin functie (of de vorige aanroep naar Refresh).
StartLogin = (clientApplication, dataSourcePath, state, display) => ...;

FinishLogin = (clientApplication, dataSourcePath, context, callbackUri, state) => ...;

Refresh = (clientApplication, dataSourcePath, oldCredential) =>  ...;

Logout = (clientApplication, dataSourcePath, accessToken) => ...;

Microsoft Entra ID-verificatie

Het Aad verificatietype is een gespecialiseerde versie van OAuth voor Microsoft Entra-id. Deze maakt gebruik van dezelfde Microsoft Entra ID-client als de ingebouwde Power Query-connectors die ondersteuning bieden voor verificatie van organisatieaccounts. Meer informatie vindt u in de quickstartgids Microsoft Entra configureren voor een aangepaste connector .

Opmerking

Als u uw eigen OAuth-stroom voor Microsoft Entra ID implementeert, kunnen gebruikers die voorwaardelijke toegang voor hun tenant hebben ingeschakeld, problemen ondervinden bij het vernieuwen met behulp van de Power BI-service. Dit heeft geen invloed op het vernieuwen op basis van een gateway, maar heeft wel invloed op een gecertificeerde connector die ondersteuning biedt voor vernieuwen vanuit de Power BI-service. Gebruikers kunnen een probleem ondervinden als gevolg van de connector met behulp van een openbare clienttoepassing bij het configureren van webreferenties via de Power BI-service. Het toegangstoken dat door deze stroom wordt gegenereerd, wordt uiteindelijk gebruikt op een andere computer (de Power BI-service in een Azure-datacenter, niet in het netwerk van het bedrijf) dan het token dat is gebruikt voor de oorspronkelijke verificatie (dat wil gezegd de computer van de gebruiker die de referenties voor de gegevensbron configureert in het netwerk van het bedrijf). Het ingebouwde Aad type omzeilt dit probleem door een andere Microsoft Entra ID client te gebruiken bij het configureren van referenties in de Power BI-service. Deze optie is niet beschikbaar voor connectors die gebruikmaken van het OAuth verificatietype.

De meeste connectors moeten waarden voor de AuthorizationUri en Resource velden opgeven. Beide velden kunnen text waarden zijn, of een functie met één argument die een text value retourneert.

AuthorizationUri = "https://login.microsoftonline.com/common/oauth2/authorize"
AuthorizationUri = (dataSourcePath) => FunctionThatDeterminesAadEndpointFromDataSourcePath(dataSourcePath)
Resource = "44445555-eeee-6666-ffff-7777aaaa8888"   // Microsoft Entra ID resource value for your service - Guid or URL
Resource = (dataSourcePath) => FunctionThatDeterminesResourceFromDataSourcePath(dataSourcePath)

Connectors die gebruikmaken van een URI-id hoeven geen waarde op te geven Resource . Standaard is de waarde gelijk aan het hoofdpad van de URI-parameter van de connector. Als de Microsoft Entra ID-resource van de gegevensbron verschilt van de domeinwaarde (bijvoorbeeld een GUID), moet er een Resource waarde worden opgegeven.

Voorbeelden van Aad-verificatietype

In het volgende geval ondersteunt de gegevensbron globale Microsoft Entra-id in de cloud met behulp van de gemeenschappelijke tenant (geen Ondersteuning voor Azure B2B). Als u het standaardbereik aanvraagt, wordt een token geretourneerd met alle eerder geautoriseerde bereiken voor de toepassings-id van de Power Query-client.

Authentication = [
    Aad = [
        AuthorizationUri = "https://login.microsoftonline.com/common/oauth2/authorize",
        Resource = "44445555-eeee-6666-ffff-7777aaaa8888", // Entra Application ID URI or app guid
        Scope = ".default"
    ]
]

In het volgende geval ondersteunt de gegevensbron tenantdetectie op basis van OpenID Connect (OIDC) of een vergelijkbaar protocol. Met deze mogelijkheid kan de connector het juiste Microsoft Entra ID-eindpunt bepalen dat moet worden gebruikt op basis van een of meer parameters in het pad naar de gegevensbron. Met deze dynamische detectiebenadering kan de connector Ondersteuning bieden voor Azure B2B.


// Implement this function to retrieve or calculate the service URL based on the data source path parameters
GetServiceRootFromDataSourcePath = (dataSourcePath) as text => ...;

GetAuthorizationUrlFromWwwAuthenticate = (url as text) as text =>
    let
        // Sending an unauthenticated request to the service returns
        // a 302 status with WWW-Authenticate header in the response. The value will
        // contain the correct authorization_uri.
        // 
        // Example:
        // Bearer authorization_uri="https://login.microsoftonline.com/{tenant_guid}/oauth2/authorize"
        responseCodes = {302, 401},
        endpointResponse = Web.Contents(url, [
            ManualCredentials = true,
            ManualStatusHandling = responseCodes
        ])
    in
        if (List.Contains(responseCodes, Value.Metadata(endpointResponse)[Response.Status]?)) then
            let
                headers = Record.FieldOrDefault(Value.Metadata(endpointResponse), "Headers", []),
                wwwAuthenticate = Record.FieldOrDefault(headers, "WWW-Authenticate", ""),
                split = Text.Split(Text.Trim(wwwAuthenticate), " "),
                authorizationUri = List.First(List.Select(split, each Text.Contains(_, "authorization_uri=")), null)
            in
                if (authorizationUri <> null) then
                    // Trim and replace the double quotes inserted before the url
                    Text.Replace(Text.Trim(Text.Trim(Text.AfterDelimiter(authorizationUri, "=")), ","), """", "")
                else
                    error Error.Record("DataSource.Error", "Unexpected WWW-Authenticate header format or value during authentication.", [
                        #"WWW-Authenticate" = wwwAuthenticate
                    ])
        else
            error Error.Unexpected("Unexpected response from server during authentication.");

<... snip ...>

Authentication = [
    Aad = [
        AuthorizationUri = (dataSourcePath) =>
            GetAuthorizationUrlFromWwwAuthenticate(
                GetServiceRootFromDataSourcePath(dataSourcePath)
            ),
        Resource = "https://myAadResourceValue.com", // Microsoft Entra ID resource value for your service - Guid or URL
        Scope = ".default"
    ]
]

Andere typen verificatie

Voor informatie over andere typen verificatie die niet in dit artikel worden behandeld, zoals eenmalige aanmelding op basis van Kerberos, gaat u naar het artikel aanvullende connectorfunctionaliteit voor meer informatie.