Udostępnij za pośrednictwem


Definiowanie profilu technicznego wskazówki dotyczącej tokenu identyfikatora w zasadach niestandardowych usługi Azure Active Directory B2C

Usługa Azure AD B2C umożliwia aplikacjom jednostki uzależnionej wysyłanie przychodzącego protokołu JWT w ramach żądania autoryzacji OAuth2. Token JWT może być wystawiony przez aplikację jednostki uzależnionej lub dostawcę tożsamości i może przekazać wskazówkę dotyczącą użytkownika lub żądania autoryzacji. Usługa Azure AD B2C weryfikuje podpis, nazwę wystawcy i odbiorców tokenu oraz wyodrębnia oświadczenie z tokenu przychodzącego.

Przypadki użycia

To rozwiązanie umożliwia wysyłanie danych do usługi Azure AD B2C hermetyzowanej w jednym tokenie JWT. RozwiązanieSignup with email invitation, w którym administrator systemu może wysłać podpisane zaproszenie do użytkowników, jest oparte na id_token_hint. Tylko użytkownicy z dostępem do wiadomości e-mail z zaproszeniem mogą utworzyć konto w katalogu.

Podejście do podpisywania tokenów

W przypadku id_token_hint wystawca tokenu (aplikacja jednostki uzależnionej lub dostawca tożsamości) komponuje token, a następnie podpisuje go przy użyciu klucza podpisywania, aby udowodnić, że token pochodzi z zaufanego źródła. Klucz podpisywania może być symetryczny lub asymetryczny. Kryptografia symetryczna lub kryptografia klucza prywatnego używa wspólnego wpisu tajnego do podpisywania i weryfikowania podpisu. Kryptografia asymetryczna lub kryptografia klucza publicznego to system kryptograficzny, który używa zarówno klucza prywatnego, jak i klucza publicznego. Klucz prywatny jest znany tylko wystawcy tokenu i służy do podpisywania tokenu. Klucz publiczny jest udostępniany zasadom usługi Azure AD B2C w celu zweryfikowania podpisu tokenu.

Format tokenu

Id_token_hint musi być prawidłowym tokenem JWT. W poniższej tabeli wymieniono oświadczenia, które są obowiązkowe. Dodatkowe oświadczenia są opcjonalne.

Nazwisko Oświadczenie Przykładowa wartość opis
Odbiorcy aud a489fc44-3cc0-4a78-92f6-e413cd853eae Identyfikuje zamierzonego adresata tokenu. Odbiorcy są dowolnym ciągiem zdefiniowanym przez wystawcę tokenu. Usługa Azure AD B2C weryfikuje tę wartość i odrzuca token, jeśli nie jest zgodny.
Wystawca iss https://localhost Identyfikuje usługę tokenu zabezpieczającego (wystawcę tokenu). Wystawca jest dowolnym identyfikatorem URI zdefiniowanym przez wystawcę tokenu. Usługa Azure AD B2C weryfikuje tę wartość i odrzuca token, jeśli nie jest zgodny.
Czas wygaśnięcia exp 1600087315 Czas, w którym token staje się nieprawidłowy, reprezentowany w czasie epoki. Usługa Azure AD B2C weryfikuje tę wartość i odrzuca token, jeśli token wygasł.
Nie wcześniej nbf 1599482515 Czas, w którym token staje się prawidłowy, reprezentowany w czasie epoki. Ten czas jest zwykle taki sam jak czas wystawienia tokenu. Usługa Azure AD B2C weryfikuje tę wartość i odrzuca token, jeśli okres istnienia tokenu jest nieprawidłowy.

Poniższy token jest przykładem prawidłowego tokenu identyfikatora:

{
  "alg": "HS256",
  "typ": "JWT"
}.{
  "displayName": " John Smith",
  "userId": "john.s@contoso.com",
  "nbf": 1599482515,
  "exp": 1600087315,
  "iss": "https://localhost",
  "aud": "a489fc44-3cc0-4a78-92f6-e413cd853eae"
}

Protokół

Atrybut Name elementu Protocol musi być ustawiony na None. Na przykład protokół profilu technicznego IdTokenHint_ExtractClaims to None:

<TechnicalProfile Id="IdTokenHint_ExtractClaims">
  <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
  <Protocol Name="None" />
  ...

Profil techniczny jest wywoływany z kroku aranżacji o typie GetClaims.

<OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />

Oświadczenia wyjściowe

Element OutputClaims zawiera listę oświadczeń do wyodrębnienia z tokenu JWT. Może być konieczne zamapowania nazwy oświadczenia zdefiniowanego w zasadach na nazwę zdefiniowaną w tokenie JWT. Można również uwzględnić oświadczenia, które nie są zwracane przez token JWT, o ile ustawisz DefaultValue atrybut.

Metadane

Następujące metadane są istotne w przypadku korzystania z klucza symetrycznego.

Atrybut Wymagania opis
issuer Tak Identyfikuje usługę tokenu zabezpieczającego (wystawcę tokenu). Ta wartość musi być identyczna z oświadczeniem iss w ramach oświadczenia tokenu JWT.
IdTokenAudience Tak Identyfikuje zamierzonego adresata tokenu. Musi być identyczna z oświadczeniem aud w ramach oświadczenia tokenu JWT.

Następujące metadane są istotne w przypadku używania klucza asymetrycznego.

Atrybut Wymagania opis
METADANYCH Tak Adres URL wskazujący dokument konfiguracji wystawcy tokenu, który jest również znany jako dobrze znany punkt końcowy konfiguracji OpenID.
issuer Nie. Identyfikuje usługę tokenu zabezpieczającego (wystawcę tokenu). Ta wartość może służyć do zastępowania wartości skonfigurowanej w metadanych i musi być identyczna z oświadczeniem iss w ramach oświadczenia tokenu JWT.
IdTokenAudience Nie. Identyfikuje zamierzonego adresata tokenu. Musi być identyczna z oświadczeniem aud w ramach oświadczenia tokenu JWT.

Ważne

Punkty końcowe muszą być zgodne z wymaganiami dotyczącymi zabezpieczeń usługi Azure AD B2C. Starsze wersje protokołu TLS i szyfry są przestarzałe. Aby uzyskać więcej informacji, zobacz Wymagania dotyczące protokołu TLS i pakietu szyfrowania usługi Azure AD B2C.

Klucze kryptograficzne

W przypadku używania klucza symetrycznego element CryptographicKeys zawiera następujący atrybut:

Atrybut Wymagania opis
client_secret Tak Klucz kryptograficzny używany do weryfikowania podpisu tokenu JWT.

Przewodnik z instrukcjami

Wystawianie tokenu z kluczami symetrycznymi

Krok 1. Tworzenie klucza współużytkowanego

Utwórz klucz, który może służyć do podpisywania tokenu. Na przykład użyj następującego kodu programu PowerShell, aby wygenerować klucz.

$bytes = New-Object Byte[] 32
$rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
$rand.GetBytes($bytes)
$rand.Dispose()
$newClientSecret = [System.Convert]::ToBase64String($bytes)
$newClientSecret

Ten kod tworzy ciąg tajny, taki jak VK62QTn0m1hMcn0DQ3RPYDAr6yIiSvYgdRwjZtU5QhI=.

Krok 2. Dodawanie klucza podpisywania do usługi Azure AD B2C

Ten sam klucz, który jest używany przez wystawcę tokenu, należy utworzyć w kluczach zasad usługi Azure AD B2C.

  1. Zaloguj się w witrynie Azure Portal.
  2. Jeśli masz dostęp do wielu dzierżaw, wybierz ikonę Ustawienia w górnym menu, aby przełączyć się do dzierżawy usługi Azure AD B2C z menu Katalogi i subskrypcje.
  3. W witrynie Azure Portal wyszukaj i wybierz pozycję Azure AD B2C.
  4. Na stronie przeglądu w obszarze Zasady wybierz pozycję Identity Experience Framework.
  5. Wybieranie kluczy zasad
  6. Wybierz pozycję Ręczne.
  7. W polu Nazwa użyj polecenia IdTokenHintKey.
    Prefiks B2C_1A_ może zostać dodany automatycznie.
  8. W polu Wpis tajny wprowadź wygenerowany wcześniej klucz logowania.
  9. W przypadku użycia klucza użyj szyfrowania.
  10. Wybierz pozycję Utwórz.
  11. Upewnij się, że klucz został utworzony B2C_1A_IdTokenHintKey.

Krok 3. Dodawanie profilu technicznego wskazówki tokenu identyfikatora

Poniższy profil techniczny weryfikuje token i wyodrębnia oświadczenia.

<ClaimsProvider>
  <DisplayName>My ID Token Hint ClaimsProvider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="IdTokenHint_ExtractClaims">
      <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
      <Protocol Name="None" />
      <Metadata>
        <Item Key="IdTokenAudience">a489fc44-3cc0-4a78-92f6-e413cd853eae</Item>
        <Item Key="issuer">https://localhost</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="client_secret" StorageReferenceId="B2C_1A_IdTokenHintKey" />
      </CryptographicKeys>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="userId" />
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Krok 4. Przygotowanie zasad

Ukończ krok Konfigurowanie zasad .

Krok 5. Przygotowanie kodu

Przykład usługi GitHub to aplikacja internetowa ASP.NET i aplikacja konsolowa, która generuje token identyfikatora podpisany przy użyciu klucza symetrycznego.

Wystawianie tokenu z kluczami asymetrycznymi

W przypadku klucza asymetrycznego token jest podpisany przy użyciu certyfikatów RSA. Ta aplikacja hostuje punkt końcowy metadanych openID Połączenie i punkt końcowy kluczy sieci Web JSON (JWKs), który jest używany przez usługę Azure AD B2C do sprawdzania poprawności podpisu tokenu identyfikatora.

Wystawca tokenu musi podać następujące punkty końcowe:

  • /.well-known/openid-configuration — Dobrze znany punkt końcowy konfiguracji z odpowiednimi informacjami o tokenie, takimi jak nazwa wystawcy tokenu i link do punktu końcowego zestawu JWK.
  • /.well-known/keys — punkt końcowy klucza internetowego JSON (JWK) z kluczem publicznym używanym do podpisywania klucza (z częścią klucza prywatnego certyfikatu).

Zobacz przykład kontrolera MVC platformy TokenMetadataController.cs .NET.

Krok 1. Przygotowanie certyfikatu z podpisem własnym

Jeśli nie masz jeszcze certyfikatu, możesz użyć certyfikatu z podpisem własnym w tym przewodniku z instrukcjami. W systemie Windows możesz użyć polecenia cmdlet New-SelfSignedCertificate programu PowerShell do wygenerowania certyfikatu.

Uruchom to polecenie programu PowerShell, aby wygenerować certyfikat z podpisem własnym. Zmodyfikuj -Subject argument odpowiednio dla aplikacji i nazwy dzierżawy usługi Azure AD B2C. Możesz również dostosować -NotAfter datę, aby określić inne wygaśnięcie certyfikatu.

New-SelfSignedCertificate `
    -KeyExportPolicy Exportable `
    -Subject "CN=yourappname.yourtenant.onmicrosoft.com" `
    -KeyAlgorithm RSA `
    -KeyLength 2048 `
    -KeyUsage DigitalSignature `
    -NotAfter (Get-Date).AddMonths(12) `
    -CertStoreLocation "Cert:\CurrentUser\My"

Krok 2. Dodawanie profilu technicznego wskazówki tokenu identyfikatora

Poniższy profil techniczny weryfikuje token i wyodrębnia oświadczenia. Zmień identyfikator URI metadanych na dobrze znany punkt końcowy konfiguracji wystawcy tokenu.

<ClaimsProvider>
  <DisplayName>My ID Token Hint ClaimsProvider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="IdTokenHint_ExtractClaims">
      <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
      <Protocol Name="None" />
      <Metadata>
        <!-- Replace with your endpoint location -->
        <Item Key="METADATA">https://your-app.azurewebsites.net/.well-known/openid-configuration</Item>
        <Item Key="IdTokenAudience">your_optional_audience</Item>
        <!-- <Item Key="issuer">your_optional_token_issuer_override</Item> -->
      </Metadata>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="userId" />
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Krok 3. Przygotowanie zasad

Ukończ krok Konfigurowanie zasad .

Krok 4. Przygotowanie kodu

Ten przykładowy ASP.NET aplikacji internetowej usługi GitHub generuje tokeny identyfikatorów i hostuje punkty końcowe metadanych wymagane do użycia parametru "id_token_hint" w usłudze Azure AD B2C.

Konfigurowanie zasad

W przypadku metod id_token_hint symetrycznych i asymetrycznych profil techniczny jest wywoływany z kroku aranżacji z typem GetClaims i musi określać oświadczenia wejściowe zasad jednostki uzależnionej.

  1. Dodaj profil techniczny IdTokenHint_ExtractClaims do zasad rozszerzenia.

  2. Dodaj następujący krok aranżacji do podróży użytkownika jako pierwszy element.

    <OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />
    
  3. W zasadach jednostki uzależnionej powtórz te same oświadczenia wejściowe skonfigurowane w profilu technicznym IdTokenHint_ExtractClaims. Przykład:

    <RelyingParty>
      <DefaultUserJourney ReferenceId="SignUp" />
      <TechnicalProfile Id="PolicyProfile">
        <DisplayName>PolicyProfile</DisplayName>
        <Protocol Name="OpenIdConnect" />
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="userId" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="displayName" />
          <OutputClaim ClaimTypeReferenceId="givenName" />
          <OutputClaim ClaimTypeReferenceId="surname" />
          <OutputClaim ClaimTypeReferenceId="email" />
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
          <OutputClaim ClaimTypeReferenceId="identityProvider" />
        </OutputClaims>
        <SubjectNamingInfo ClaimType="sub" />
      </TechnicalProfile>
    </RelyingParty>
    

W zależności od wymagań biznesowych może być konieczne dodanie weryfikacji tokenu, na przykład sprawdzenie formatu adresu e-mail. W tym celu dodaj kroki aranżacji, które wywołują profil techniczny przekształcania oświadczeń. Dodaj również własny profil techniczny, aby wyświetlić komunikat o błędzie.

Tworzenie i podpisywanie tokenu

Przykłady usługi GitHub ilustrują sposób tworzenia takiego tokenu, który później został wysłany jako id_token_hint parametr ciągu zapytania. Poniżej przedstawiono przykład żądania autoryzacji z parametrem id_token_hint

https://tenant-name.b2clogin.com/tenant-name.onmicrosoft.com/B2C_1A_signup_signin/oauth2/v2.0/authorize?client_id=63ba0d17-c4ba-47fd-89e9-31b3c2734339&nonce=defaultNonce&redirect_uri=https%3A%2F%2Fjwt.ms&scope=openid&response_type=id_token&prompt=login&id_token_hint=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaXNwbGF5TmFtZSI6IiBKb2huIFNtaXRoIiwidXNlcklkIjoiam9obi5zQGNvbnRvc28uY29tIiwibmJmIjoxNTk5NDgyNTE1LCJleHAiOjE2MDAwODczMTUsImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0IiwiYXVkIjoiYTQ4OWZjNDQtM2NjMC00YTc4LTkyZjYtZTQxM2NkODUzZWFlIn0.nPmLXydI83PQCk5lRBYUZRu_aX58pL1khahHyQuupig

Następne kroki