Del via


Håndtering av autentisering

Godkjenningstyper

En utvidelse kan støtte én eller flere typer autentisering. Hver autentiseringstype er en annen type legitimasjon. Autentiseringsgrensesnittet som vises for sluttbrukere i Power Query styres av typen legitimasjon som en utvidelse støtter.

Listen over støttede autentiseringstyper defineres som en del av en utvidelses definisjon av Data Source Type . Hver autentiseringsverdi er en post med spesifikke felt. Tabellen nedenfor viser forventede felt for hver type. Alle felt er påkrevd med mindre det er merket noe annet.

Autentiseringstype Felt Bekrivelse
Anonym Den anonyme (også kalt Implicit) autentiseringsformen har ingen felt.
OAuth StartLogin Funksjon som gir URL og tilstandsinformasjon for å starte en OAuth-flyt.

Gå til delen Implementing an OAuth Flow .
FinishLogin Funksjon som trekker ut access_token og andre egenskaper knyttet til OAuth-flyten.
Oppdater (valgfritt) Funksjon som henter en ny tilgangstoken fra en oppdateringstoken.
Logout (valgfritt) Funksjon som ugyldiggjør brukerens nåværende tilgangstoken.
Etikett (valgfritt) En tekstverdi som lar deg overstyre standardetiketten for denne AuthenticationKind.
Aad AuthorizationUri text verdi eller unær funksjon som returnerer Microsoft Entra ID-autorisasjonsendepunktet (eksempel: "https://login.microsoftonline.com/common/oauth2/authorize").

Gå til Microsoft Entra ID-autentiseringsseksjonen .
Resource text verdi eller unær funksjon som returnerer Microsoft Entra-ID-ressursverdien for tjenesten din.
Scope (valgfritt)text verdi- eller unær funksjon som returnerer listen over omfang(er) for å be om som en del av autentiseringsprosessen. Flere omfangsverdier bør være adskilt med et mellomrom. Scope-verdien bør være scope-navnet, uten en Application ID-URI (eksempel: Data.Read). Når det ikke er oppgitt, user_impersonation blir omfanget bedt om.
BrukernavnPassord UsernameLabel (valgfritt) En tekstverdi for å erstatte standardetiketten for tekstboksen Brukernavn i legitimasjonsgrensesnittet.
PasswordLabel (valgfritt) En tekstverdi for å erstatte standardetiketten for passordtekstboksen i legitimasjonsgrensesnittet.
Etikett (valgfritt) En tekstverdi som lar deg overstyre standardetiketten for denne AuthenticationKind.
Windows UsernameLabel (valgfritt) En tekstverdi for å erstatte standardetiketten for tekstboksen Brukernavn i legitimasjonsgrensesnittet.
PasswordLabel (valgfritt) En tekstverdi for å erstatte standardetiketten for passordtekstboksen i legitimasjonsgrensesnittet.
Etikett (valgfritt) En tekstverdi som lar deg overstyre standardetiketten for denne AuthenticationKind.
Nøkkel KeyLabel (valgfritt) En tekstverdi for å erstatte standardetiketten for API-nøkkeltekstboksen på legitimasjonsgrensesnittet.
Etikett (valgfritt) En tekstverdi som lar deg overstyre standardetiketten for denne AuthenticationKind.

Følgende eksempel viser autentiseringsposten for en kobling som støtter OAuth, Key, Windows, Basic (brukernavn og passord) og anonyme legitimasjoner.

Eksempel:

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

Tilgang til gjeldende legitimasjon

De nåværende legitimasjonene kan hentes ved hjelp av funksjonen Extension.CurrentCredential .

M datakildefunksjoner som er aktivert for utvidelse, arver automatisk utvidelsens legitimasjonsomfang. I de fleste tilfeller trenger du ikke eksplisitt å få tilgang til gjeldende legitimasjon, men det finnes unntak, som for eksempel:

  • Å sende inn legitimasjonen i en egendefinert header eller spørringsstrengparameter (for eksempel når du bruker API Key-autentiseringstypen).
  • Å sette tilkoblingsstreng-egenskaper for ODBC eller ADO.NET utvidelser.
  • Sjekker egendefinerte egenskaper på en OAuth-token.
  • Å bruke legitimasjonen som en del av en OAuth v1-flyt.

Funksjonen Extension.CurrentCredential returnerer et postobjekt. Feltene den inneholder er spesifikke for autentiseringstype. Følgende tabell inneholder detaljer.

Felt Bekrivelse Brukt av
AuthenticationKind Inneholder navnet på autentiseringstypen som er tildelt denne legitimasjonen (BrukernavnPassord, OAuth, og så videre). Alle
Brukernavn Brukernavnsverdi BrukernavnPassord, Windows
Passord Passordverdi. Vanligvis brukt med BrukernavnPassord, men det er også satt til Nøkkel. Nøkkel, brukernavnPassord, Windows
access_token OAuth tilgangstoken-verdi. OAuth
Egenskaper En post som inneholder andre egendefinerte egenskaper for en gitt legitimasjon. Vanligvis brukt med OAuth for å lagre andre egenskaper (som refresh_token) som returneres med access_token under autentiseringsprosessen. OAuth
Nøkkel API-nøkkelverdien. Merk at nøkkelverdien også er tilgjengelig i Passordfeltet. Som standard setter mashup-motoren inn denne nøkkelen i en autorisasjonsheader som om denne verdien var et grunnleggende autentiseringspassord (uten brukernavn). Hvis denne typen oppførsel ikke er det du ønsker, må du spesifisere alternativet ManualCredentials = true i optionsposten. Nøkkel
EncryptConnection En logisk verdi som avgjorde om det skulle kreves en kryptert tilkobling til datakilden. Denne verdien er tilgjengelig for alle autentiseringstyper, men settes kun hvis EncryptConnection er spesifisert i Data Source-definisjonen. Alle

Følgende kodeeksempel får tilgang til gjeldende legitimasjon for en API-nøkkel og bruker den til å fylle ut en egendefinert header (x-APIKey).

Eksempel:

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

Implementering av en OAuth-flyt

OAuth-autentiseringstypen gjør det mulig for en utvidelse å implementere egendefinert logikk for sin tjeneste. For å gjøre dette tilbyr en utvidelse funksjoner for StartLogin (returnere autorisasjons-URI-en for å starte OAuth-flyten) og FinishLogin (bytte autorisasjonskoden mot en tilgangstoken). Utvidelser kan valgfritt implementere Refresh (bytte ut en oppdateringstoken med en ny tilgangstoken) og Logout (utløper de nåværende oppdaterings- og tilgangstokenene) funksjoner også.

Note

Power Query-utvidelser evalueres i applikasjoner som kjører på klientmaskiner. Data Connectors skal ikke bruke konfidensielle hemmeligheter i sine OAuth-flyter, da brukere kan inspisere utvidelsen eller nettverkstrafikken for å finne ut hemmeligheten. Gå til Proof Key for Code Exchange fra OAuth Public Clients RFC (også kjent som PKCE) for flere detaljer om hvordan du kan tilby flyter som ikke er avhengige av delte hemmeligheter. Et eksempel på implementering av denne flyten finnes på vår GitHub-nettside.

Det finnes to sett med OAuth-funksjonssignaturer: den opprinnelige signaturen som inneholder et minimalt antall parametere, og en avansert signatur som aksepterer flere parametere. De fleste OAuth-flyter kan implementeres ved hjelp av de opprinnelige signaturene. Du kan også mikse og matche signaturtyper i implementasjonen din. Funksjonskallene er matcher basert på antall parametere (og deres typer). Parameternavnene tas ikke i betraktning.

Gå til GitHub-eksempelet for flere detaljer.

Originale OAuth-signaturer

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

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

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

Logout = (accessToken) => ...;

Avanserte OAuth-signaturer

Notater om de avanserte signaturene:

  • Alle signaturer aksepterer en clientApplication postverdi, som er reservert for fremtidig bruk.
  • Alle signaturer aksepterer a dataSourcePath (også kalt som resourceUrl i de fleste samples).
  • Funksjonen Refresh aksepterer en oldCredential parameter, som er den forrige record returnert av funksjonen din FinishLogin (eller forrige kall til Refresh).
StartLogin = (clientApplication, dataSourcePath, state, display) => ...;

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

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

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

Microsoft Entra ID-godkjenning

Autentiseringstypen Aad er en spesialisert versjon av OAuth for Microsoft Entra ID. Den bruker den samme Microsoft Entra ID-klienten som de innebygde Power Query-koblingene som støtter autentisering av organisasjonskontoer. Mer informasjon finnes i Konfigurere Microsoft Entra for en rask startguide for tilpasset tilkobling.

Note

Hvis du implementerer din egen OAuth-flyt for Microsoft Entra-ID, kan brukere som har aktivert betinget tilgang for sin leietaker oppleve problemer når de oppdaterer med Power BI-tjenesten. Dette vil ikke påvirke gateway-basert oppdatering, men vil påvirke en sertifisert kontakt som støtter oppdatering fra Power BI-tjenesten. Brukere kan støte på et problem som stammer fra at connectoren bruker en offentlig klientapplikasjon når de konfigurerer webbaserte legitimasjoner gjennom Power BI-tjenesten. Tilgangstokenet som genereres av denne flyten vil til slutt bli brukt på en annen datamaskin (det vil si Power BI-tjenesten i et Azure-datasenter, ikke på selskapets nettverk) enn den som ble brukt til opprinnelig autentisering (det vil si datamaskinen til brukeren som konfigurerer datakildens legitimasjon på selskapets nettverk). Den innebygde Aad typen omgår dette problemet ved å bruke en annen Microsoft Entra ID-klient når man konfigurerer legitimasjon i Power BI-tjenesten. Dette alternativet vil ikke være tilgjengelig for kontakter som bruker autentiseringstypen OAuth .

De fleste kontakter må oppgi verdier for AuthorizationUri og-feltene Resource . Begge feltene kan være text verdier, eller en enkelt argumentfunksjon som returnerer en text value.

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)

Koblinger som bruker en URI-basert identifikator trenger ikke å gi en Resource verdi. Som standard er verdien lik rotstien til koblingens URI-parameter. Hvis datakildens Microsoft Entra ID-ressurs er annerledes enn domeneverdien (for eksempel bruker den en GUID), må en Resource verdi oppgis.

Aad-autentiseringseksempler

I det følgende tilfellet støtter datakilden global skybasert Microsoft Entra ID ved bruk av felles leietaker (ingen Azure B2B-støtte). Å be om .default-scope returnerer et token med alle tidligere autoriserte scopes for Power Query-klientapplikasjons-ID-en.

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"
    ]
]

I følgende tilfelle støtter datakilden leietakeroppdagelse basert på OpenID Connect (OIDC) eller lignende protokoll. Denne muligheten gjør det mulig for kontakten å bestemme riktig Microsoft Entra ID-endepunkt å bruke basert på én eller flere parametere i datakildebanen. Denne dynamiske oppdagelsesmetoden gjør det mulig for tilkoblingen å støtte 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"
    ]
]

Andre typer autentisering

For informasjon om andre typer autentisering som ikke dekkes i denne artikkelen, som Kerberos-basert single sign-on, besøk artikkelen om ekstra tilkoblingsfunksjonalitet for å lære mer.