Udostępnij przez


Konfigurowanie usługi Azure Active Directory B2C za pomocą rozwiązania Deduce w celu zwalczania oszustw związanych z tożsamościami i tworzenia zaufanego środowiska użytkownika

Ważne

Od 1 maja 2025 r. usługa Azure AD B2C nie będzie już dostępna do zakupu dla nowych klientów. Dowiedz się więcej w naszych często zadawanych pytaniach.

W tym przykładowym artykule przedstawiono wskazówki dotyczące sposobu integrowania uwierzytelniania usługi Azure Active Directory B2C (Azure AD B2C) z usługą Deduce. Deduce koncentruje się na zatrzymaniu oszustw związanych z przejęciem kont i rejestracją — najszybciej rozwijającym się oszustwem w Internecie. Deduce Identity Network jest napędzana przez koalicję ponad 150 000 witryn internetowych i aplikacji, które codziennie udostępniają Deduce logowania, rejestracje i procesy płatności ponad 1,4 miliarda razy.

Wynikowa analiza tożsamości zatrzymuje ataki, zanim staną się problemem finansowym i odpowiedzialnością korporacyjną. Używa ona historycznej analizy behawioralnej jako predyktora zaufania, dzięki czemu organizacje mogą dostarczać bezproblemowe środowisko użytkownika dla swoich najlepszych klientów. Kompleksowy zakres sygnałów ryzyka i zaufania może informować o każdej decyzji uwierzytelniania za pomocą wystąpienia usługi Azure AD B2C. Dzięki tej integracji organizacje mogą rozszerzać możliwości usługi Azure AD B2C podczas procesu rejestracji lub logowania, aby uzyskać dodatkowe szczegółowe informacje o użytkowniku z interfejsu API usługi Deduce Insights. Niektóre atrybuty przetwarzane przez interfejs API Deduce to:

  • Email
  • Adres IP
  • Agent użytkownika

Wymagania wstępne

Aby rozpocząć pracę, potrzebne są następujące elementy:

Opis scenariusza

Integracja obejmuje następujące składniki:

  • Azure AD B2C — serwer autoryzacji odpowiedzialny za weryfikowanie poświadczeń użytkownika, znany również jako dostawca tożsamości.
  • Deduce — usługa Deduce pobiera dane wejściowe udostępniane przez użytkownika i udostępnia szczegółowe informacje o aktywności cyfrowej na temat tożsamości użytkownika.
  • Niestandardowy interfejs REST API — ten interfejs API implementuje integrację między usługą Azure AD B2C a interfejsem API Deduce Insights.

Na poniższym diagramie architektury przedstawiono implementację: obraz przedstawia diagram architektury.

Kroki Opis
1. Użytkownik otwiera stronę logowania usługi Azure AD B2C, a następnie zaloguje się lub zarejestruje się, wprowadzając nazwę użytkownika.
2. Usługa Azure AD B2C wywołuje interfejs API warstwy środkowej i przekazuje atrybuty użytkownika.
3 Interfejs API warstwy środkowej zbiera atrybuty użytkownika i przekształca go w format używany przez interfejs API deduce, a następnie wysyła go do deduce.
4. Deduce używa informacji i przetwarza je w celu zweryfikowania identyfikacji użytkownika na podstawie analizy ryzyka. Następnie zwraca wynik do interfejsu API warstwy środkowej.
5 Interfejs API warstwy środkowej przetwarza informacje i wysyła sygnały ryzyka, zaufania i informacji w poprawnym formacie JSON do usługi Azure AD B2C.
6. Usługa Azure AD B2C otrzymuje informacje zwrotne z interfejsu API warstwy środkowej.
Jeśli zostanie wyświetlona odpowiedź awarii, użytkownikowi zostanie pokazany komunikat o błędzie.
Jeśli wyświetli się komunikat o powodzeniu, użytkownik zostanie uwierzytelniony i zapisany w katalogu.

Rozpocznij integrację z Deduce

Aby utworzyć konto deduce, skontaktuj się z pomocą techniczną firmy Deduce. Po utworzeniu konta otrzymasz identyfikator witryny i klucz interfejsu API , który będzie potrzebny do konfiguracji interfejsu API.

W poniższych sekcjach opisano proces integracji.

Krok 1. Konfigurowanie zasad usługi Azure AD B2C

Postępuj zgodnie z instrukcjami w temacie Pobieranie pakietu startowego , aby dowiedzieć się, jak skonfigurować dzierżawę usługi Azure AD B2C i skonfigurować zasady. Ten artykuł z przykładami jest oparty na pakiecie startowym Konta Lokalne.

Krok 2. Dostosowywanie interfejsu użytkownika usługi Azure AD B2C

Aby zebrać dane user_agent po stronie klienta, utwórz własny element **ContentDefinition** z dowolnym identyfikatorem, aby dołączyć odpowiedni kod JavaScript. Określ ciąg user_agent przeglądarki użytkownika końcowego i zapisz go jako oświadczenie w usłudze Azure AD B2C.

  1. Pobierz plik api.selfasserted, selfAsserted.cshtml lokalnie.

  2. Edytuj plik selfAsserted.cshtml, aby uwzględnić następujący kod JavaScript przed zamknięciem </head> definiuje dodatkowy element Style, aby ukryć ustawienie domyślne panelu.

    <style>
     .panel-default   {
     margin: 0 auto;
     width: 60%;
     height: 0px;
     background-color: #296ec6;
     opacity: 1;
     border-radius: .5rem;
     border: none;
     color: #fff;
     font-size: 1em;
     box-shadow: 0 0 30px 0 #dae1f7;
     visibility: hidden;
    } 
    
    </style>
    
  3. Dodaj następujący kod JavaScript przed zamknięciem obiektu </body>. Ten kod odczytuje identyfikator użytkownika (user_agent) z przeglądarki użytkownika, a element ContentDefinition jest używany w połączeniu z autonomicznym profilem technicznym w celu zwrócenia identyfikatora użytkownika (user_agent) jako oświadczenia wyjściowego do następnego kroku orkiestracji.

    <script>
         $("#user_agent").hide().val(window.navigator.userAgent);
         var img = new Image();
         img.onload = function() {
         document.getElementById("continue").click();
      };
         img.src = "https://login.microsoftonline.com/static/tenant/templates/images/logo.svg";
    </script>
    

Krok 3. Konfigurowanie lokalizacji przechowywania

  1. Skonfiguruj kontener magazynu blob na swoim koncie magazynu i prześlij wcześniej edytowany **selfAsserted.cshtml** plik do swojego kontenera blob.

  2. Zezwalaj na dostęp mechanizmu CORS do utworzonego kontenera magazynu, wykonując następujące instrukcje:

    1. Przejdź do Ustawienia>Dozwolone pochodzenie, wprowadź https://your_tenant_name.b2clogin.com. Zastąp your-tenant- name ciąg nazwą dzierżawy usługi Azure AD B2C, taką jak fabrikam. Podczas wprowadzania nazwy dzierżawy użyj wszystkich małych liter.

    2. W obszarze Dozwolone metody wybierz pozycję GET i PUT.

    3. Wybierz Zapisz.

Krok 4. Konfigurowanie definicji zawartości

Aby dostosować interfejs użytkownika, należy określić adres URL w elemecie ContentDefinition z dostosowaną zawartością HTML. W kroku samookreślonego profilu technicznego lub orkiestracji wskażesz ten identyfikator ContentDefinition.

  1. Otwórz element TrustFrameworksExtension.xml i zdefiniuj nową definicję zawartości, aby dostosować własny profil techniczny.

  2. Znajdź element BuildingBlocks i dodaj **api.selfassertedDeduce** ContentDefinition:

     <BuildingBlocks>
     ...
     <ContentDefinitions>
       <ContentDefinition Id="api.selfassertedDeduce">
         <LoadUri>https://<STORAGE-ACCOUNT-NAME>.blob.core.windows.net/<CONTAINER>/selfAsserted.cshtml</LoadUri>
         <RecoveryUri>~/common/default_page_error.html</RecoveryUri>
         <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.7</DataUri>
         <Metadata>
           <Item Key="DisplayName">Signin and Signup Deduce</Item>
         </Metadata>
       </ContentDefinition>
     </ContentDefinitions>
       ...
    </BuildingBlocks>
    

Zastąp wartość LoadUri adresem URL wskazującym na plik selfAsserted.cshtml utworzony w kroku 1.

Krok 5: Wnioskowanie o dodatkowy TypRoszczenia

Element ClaimsSchema definiuje typy oświadczeń, do których można odwoływać się w ramach zasad. Istnieją dodatkowe oświadczenia, które Deduce wspiera i można je dodać.

  1. Otwórz TrustFrameworksExtension.xml

  2. W elememencie **BuildingBlocks** można dodać dodatkowe oświadczenia tożsamości obsługiwane przez usługę Deduce.

      <BuildingBlocks>
    ...
     <ClaimsSchema>
      <!-- Claims for Deduce API request body -->
       <ClaimType Id="site">
         <DisplayName>Site ID</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Deduce Insight API site id</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="ip">
         <DisplayName>IP Address</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="apikey">
         <DisplayName>API Key</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="action">
         <DisplayName>Contextual action</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
    
       <!-- End of Claims for Deduce API request body -->
    
       <!-- Rest API call request body to deduce insight API -->
       <ClaimType Id="deduce_requestbody">
         <DisplayName>Request body for insight api</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Request body for insight api</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="deduce_trust_response">
         <DisplayName>Response body for insight api</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Response body for insight api</AdminHelpText>
       </ClaimType>
       <!-- End of Rest API call request body to deduce insight API -->
    
       <!-- Response claims from Deduce Insight  API -->
    
       <ClaimType Id="data.signals.trust">
         <DisplayName>Trust collection</DisplayName>
         <DataType>stringCollection</DataType>
         <AdminHelpText>List of asserted trust</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="data.signals.info">
         <DisplayName>Trust collection</DisplayName>
         <DataType>stringCollection</DataType>
         <AdminHelpText>List of asserted info</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="data.signals.risk">
         <DisplayName>Trust collection</DisplayName>
         <DataType>stringCollection</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="data.network.company_name">
         <DisplayName>data.network.company_name</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.crawler_name">
         <DisplayName>data.network.crawler_name</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_corporate">
         <DisplayName>data.network.is_corporate</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_education">
         <DisplayName>data.network.is_education</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_hosting">
         <DisplayName>data.network.is_hosting</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_mobile">
         <DisplayName>data.network.is_mobile</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_proxy">
         <DisplayName>data.network.is_proxy"</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_tor">
         <DisplayName>data.network.is_tor</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_vpn_capable">
         <DisplayName>data.network.is_vpn_capable</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_vpn_confirmed">
         <DisplayName>data.network.is_vpn_confirmed</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.is_vpn_suspect">
         <DisplayName>data.network.is_vpn_suspect</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.isp_name">
         <DisplayName>data.network.isp_name</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.network.vpn_name">
         <DisplayName>data.network.vpn_name</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.geo.city">
         <DisplayName>data.geo.city</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.geo.country">
         <DisplayName>data.geo.country</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.geo.lat">
         <DisplayName>data.geo.lat</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.geo.long">
         <DisplayName>data.geo.long</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.geo.state">
         <DisplayName>data.geo.state</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.device.ua_brand">
         <DisplayName>data.device.ua_brand</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.device.ua_browser">
         <DisplayName>data.device.ua_browser</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.device.ua_device_type">
         <DisplayName>data.device.ua_device_type</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.device.ua_name">
         <DisplayName>data.device.ua_name</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.device.ua_os">
         <DisplayName>data.device.ua_os</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.device.ua_type">
         <DisplayName>data.device.ua_type</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.device.ua_version">
         <DisplayName>data.device.ua_version</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>List of asserted risk</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.email.ip_count">
         <DisplayName>data.activity.email.ip_count</DisplayName>
         <DataType>int</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.email.lastseen">
         <DisplayName>data.activity.email.lastseen</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.email.frequency">
         <DisplayName>data.activity.email.frequency</DisplayName>
         <DataType>int</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.emailip.frequency">
         <DisplayName>data.activity.emailip.frequency</DisplayName>
         <DataType>int</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.emailip.lastseen">
         <DisplayName>data.activity.emailip.lastseen</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.emailip.match">
         <DisplayName>data.activity.emailip.match</DisplayName>
         <DataType>boolean</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.emailip.rank_email">
         <DisplayName>data.activity.emailip.rank_email</DisplayName>
         <DataType>int</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.emailip.rank_ip">
         <DisplayName>data.activity.emailip.rank_ip</DisplayName>
         <DataType>int</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.ip.email_count">
         <DisplayName>data.activity.ip.email_count</DisplayName>
         <DataType>int</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
       <ClaimType Id="data.activity.ip.lastseen">
         <DisplayName>data.activity.ip.lastseen</DisplayName>
         <DataType>string</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="data.activity.ip.frequency">
         <DisplayName>data.activity.ip.frequency</DisplayName>
         <DataType>int</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="data.sent_timestamp">
         <DisplayName>datasent_timestamp</DisplayName>
         <DataType>long</DataType>
         <AdminHelpText>Add help text here</AdminHelpText>
       </ClaimType>
    
       <ClaimType Id="user_agent">
         <DisplayName>User Agent</DisplayName>
         <DataType>string</DataType>
         <UserHelpText>Add help text here</UserHelpText>
         <UserInputType>TextBox</UserInputType>
       </ClaimType>
    
       <ClaimType Id="correlationId">
         <DisplayName>correlation ID</DisplayName>
         <DataType>string</DataType>
       </ClaimType>
     <!-- End Response claims from Deduce Insight API -->
     ...
     </ClaimsSchema>
     ...
     </BuildingBlocks>
    
    

Krok 6: Dodaj usługi dostawcy roszczeń deduce

Dostawca roszczeń to interfejs do komunikowania się z różnymi typami podmiotów za pośrednictwem swoich profilów technicznych.

Deduce można zdefiniować jako dostawcę oświadczeń, dodając go do elementu ClaimsProvider w pliku rozszerzenia zasad.

  1. Otwórz TrustFrameworkExtensions.xml.

  2. Znajdź element ClaimsProvider . Jeśli jeszcze nie istnieje, dodaj nowy element ClaimsProvider w następujący sposób:

     <ClaimsProvider>
       <DisplayName>Deduce REST API</DisplayName>
       <TechnicalProfiles>
         <TechnicalProfile Id="SelfAsserted-UserAgent">
           <DisplayName>Pre-login</DisplayName>
           <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral,         PublicKeyToken=null" />
           <Metadata>
             <Item Key="ContentDefinitionReferenceId">api.selfassertedDeduce</Item>
             <Item Key="setting.showCancelButton">false</Item>
             <Item Key="language.button_continue">Continue</Item>
           </Metadata>
           <OutputClaims>
             <OutputClaim ClaimTypeReferenceId="user_agent" />
           </OutputClaims>
         </TechnicalProfile>
         <TechnicalProfile Id="deduce_insight_api">
           <DisplayName>Get customer insight data from deduce api</DisplayName>
           <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
           <Metadata>
             <Item Key="ServiceUrl">https://deduceproxyapi.azurewebsites.net/api/Deduce/DeduceInsights</Item>
             <Item Key="AuthenticationType">None</Item>
             <Item Key="SendClaimsIn">Body</Item>
             <Item Key="ResolveJsonPathsInJsonTokens">true</Item>
             <Item Key="AllowInsecureAuthInProduction">true</Item>
             <Item Key="DebugMode">true</Item>
             <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item>
           </Metadata>
           <InputClaims>
             <InputClaim ClaimTypeReferenceId="user_agent" />
             <InputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
             <InputClaim ClaimTypeReferenceId="ip" DefaultValue="{Context:IPAddress}" AlwaysUseDefaultValue="true" />
             <InputClaim ClaimTypeReferenceId="apikey" DefaultValue="<DEDUCE API KEY>" />
             <InputClaim ClaimTypeReferenceId="action" DefaultValue="auth.success.password" />
             <InputClaim ClaimTypeReferenceId="site" DefaultValue="<SITE>" />
           </InputClaims>
           <OutputClaims>
             <OutputClaim ClaimTypeReferenceId="data.sent_timestamp" PartnerClaimType="data.sent_timestamp" />
             <OutputClaim ClaimTypeReferenceId="data.activity.ip.frequency" PartnerClaimType="data.activity.ip.frequency" />
             <OutputClaim ClaimTypeReferenceId="data.activity.ip.lastseen" PartnerClaimType="data.activity.ip.lastseen" />
             <OutputClaim ClaimTypeReferenceId="data.activity.ip.email_count" PartnerClaimType="data.activity.ip.email_count" />
             <OutputClaim ClaimTypeReferenceId="data.activity.email.ip_count" PartnerClaimType="data.activity.email.ip_count" />
             <OutputClaim ClaimTypeReferenceId="data.activity.email.lastseen" PartnerClaimType="data.activity.email.lastseen" />
             <OutputClaim ClaimTypeReferenceId="data.activity.email.frequency" PartnerClaimType="data.activity.email.frequency" />
             <OutputClaim ClaimTypeReferenceId="data.activity.emailip.frequency" PartnerClaimType="data.activity.emailip.frequency" />
             <OutputClaim ClaimTypeReferenceId="data.activity.emailip.lastseen" PartnerClaimType="data.activity.emailip.lastseen" />
             <OutputClaim ClaimTypeReferenceId="data.activity.emailip.match" PartnerClaimType="data.activity.emailip.match" />
             <OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_email" PartnerClaimType="data.activity.emailip.rank_email" />
             <OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_ip" PartnerClaimType="data.activity.emailip.rank_ip" />
             <OutputClaim ClaimTypeReferenceId="data.signals.trust" PartnerClaimType="data.signals.trust" />
             <OutputClaim ClaimTypeReferenceId="data.signals.info" PartnerClaimType="data.signals.info" />
             <OutputClaim ClaimTypeReferenceId="data.signals.risk" PartnerClaimType="data.signals.risk" />
             <OutputClaim ClaimTypeReferenceId="data.network.company_name" PartnerClaimType="data.network.company_name" />
             <OutputClaim ClaimTypeReferenceId="data.network.crawler_name" PartnerClaimType="data.network.crawler_name" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_corporate" PartnerClaimType="data.network.is_corporate" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_education" PartnerClaimType="data.network.is_education" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_hosting" PartnerClaimType="data.network.is_hosting" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_mobile" PartnerClaimType="data.network.is_mobile" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_proxy" PartnerClaimType="data.network.is_proxy" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_tor" PartnerClaimType="data.network.is_tor" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_capable" PartnerClaimType="data.network.is_vpn_capable" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_confirmed" PartnerClaimType="data.network.is_vpn_confirmed" />
             <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_suspect" PartnerClaimType="data.network.is_vpn_suspect" />
             <OutputClaim ClaimTypeReferenceId="data.network.isp_name" PartnerClaimType="data.network.isp_name" />
             <OutputClaim ClaimTypeReferenceId="data.network.vpn_name" PartnerClaimType="data.network.vpn_name" />
             <OutputClaim ClaimTypeReferenceId="data.geo.city" PartnerClaimType="data.geo.city" />
             <OutputClaim ClaimTypeReferenceId="data.geo.country" PartnerClaimType="data.geo.country" />
             <OutputClaim ClaimTypeReferenceId="data.geo.lat" PartnerClaimType="data.geo.lat" />
             <OutputClaim ClaimTypeReferenceId="data.geo.long" PartnerClaimType="data.geo.long" />
             <OutputClaim ClaimTypeReferenceId="data.geo.state" PartnerClaimType="data.geo.state" />
             <OutputClaim ClaimTypeReferenceId="data.device.ua_brand" PartnerClaimType="data.device.ua_brand" />
             <OutputClaim ClaimTypeReferenceId="data.device.ua_browser" PartnerClaimType="data.device.ua_browser" />
             <OutputClaim ClaimTypeReferenceId="data.device.ua_device_type" PartnerClaimType="data.device.ua_device_type" />
             <OutputClaim ClaimTypeReferenceId="data.device.ua_name" PartnerClaimType="data.device.ua_name" />
             <OutputClaim ClaimTypeReferenceId="data.device.ua_os" PartnerClaimType="data.device.ua_os" />
             <OutputClaim ClaimTypeReferenceId="data.device.ua_type" PartnerClaimType="data.device.ua_type" />
             <OutputClaim ClaimTypeReferenceId="data.device.ua_version" PartnerClaimType="data.device.ua_version" />
           </OutputClaims>
         </TechnicalProfile>
       </TechnicalProfiles>
     </ClaimsProvider>
    
    

Zastąp apikey i site informacjami podanymi przez Deduce podczas początkowego wdrożenia.

Krok 7. Dodawanie podróży użytkownika

Na tym etapie skonfigurowano interfejs API Deduce RESTfull , ale nie jest jeszcze dostępny na żadnej ze stron rejestracji ani logowania. Jeśli nie masz własnej niestandardowej podróży użytkownika, utwórz duplikat szablonu podróży użytkownika, inaczej przejdź do następnego kroku.

  1. TrustFrameworkBase.xml Otwórz plik z pakietu startowego.

  2. Znajdź i skopiuj całą zawartość elementu UserJourneys , który zawiera Id=SignUpOrSignInelement .

  3. Otwórz element TrustFrameworkExtensions.xml i znajdź element UserJourneys . Jeśli element nie istnieje, dodaj go.

  4. Wklej całą zawartość elementu UserJourney skopiowaną jako element podrzędny elementu UserJourneys .

  5. Id Zmień nazwę podróży użytkownika. Na przykład Id=CustomSignUpSignIn

Krok 8. Dodawanie interfejsu API Deduce do podróży użytkownika

Teraz, gdy masz już podróż użytkownika, dodaj kroki orkiestracji, aby wywołać funkcję Deduce.

  1. Znajdź element kroku aranżacji, który zawiera Type=CombinedSignInAndSignUp lub Type=ClaimsProviderSelection w ścieżce użytkownika. Zazwyczaj jest to pierwszy krok aranżacji.

  2. Aby wywołać profil techniczny SelfAsserted-UserAgent, dodaj nowy etap orkiestracji.

  3. Aby wywołać profil techniczny **deduce_insight_api**, dodaj nowy etap orkiestracji.

    Poniższy przykład userJourney jest oparty na pakiecie startowym kont lokalnych:

     <UserJourneys>
      <UserJourney Id="CustomSignUpOrSignIn">
       <OrchestrationSteps>
         <OrchestrationStep Order="1" Type="ClaimsExchange">
           <ClaimsExchanges>
             <ClaimsExchange Id="Browser-UserAgent" TechnicalProfileReferenceId="SelfAsserted-UserAgent" />
           </ClaimsExchanges>
         </OrchestrationStep>
         <OrchestrationStep Order="2" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin">
           <ClaimsProviderSelections>
             <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" />
           </ClaimsProviderSelections>
           <ClaimsExchanges>
             <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" />
           </ClaimsExchanges>
         </OrchestrationStep>
    
         <OrchestrationStep Order="3" Type="ClaimsExchange">
           <Preconditions>
             <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
               <Value>objectId</Value>
               <Action>SkipThisOrchestrationStep</Action>
             </Precondition>
           </Preconditions>
           <ClaimsExchanges>
             <ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="LocalAccountSignUpWithLogonEmail" />
           </ClaimsExchanges>
         </OrchestrationStep>
    
         <!-- This step reads any user attributes that we may not have received when in the token. -->
         <OrchestrationStep Order="4" Type="ClaimsExchange">
           <ClaimsExchanges>
             <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
           </ClaimsExchanges>
         </OrchestrationStep>
         <OrchestrationStep Order="5" Type="ClaimsExchange">
           <ClaimsExchanges>
             <ClaimsExchange Id="DecideInsights" TechnicalProfileReferenceId="deduce_insight_api" />
           </ClaimsExchanges>
         </OrchestrationStep>
         <OrchestrationStep Order="6" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    
       </OrchestrationSteps>
       <ClientDefinition ReferenceId="DefaultWeb" />
     </UserJourney>
    </UserJourneys>
    

Krok 9. Konfigurowanie zasad jednostki uzależnionej

Zasady strony polegającej określają podróż użytkownika, którą przeprowadzi Azure AD B2C. Możesz również kontrolować, jakie oświadczenia są przekazywane do aplikacji, modyfikując element OutputClaims w elemencie SignUpOrSignIn_WithDeduce TechnicalProfile. W tym przykładzie aplikacja otrzyma informacje z powrotem z interfejsu API warstwy środkowej:

    <RelyingParty>
        <DefaultUserJourney ReferenceId="CustomSignUpOrSignIn" />
        <UserJourneyBehaviors>
            <ScriptExecution>Allow</ScriptExecution>
        </UserJourneyBehaviors>
        <TechnicalProfile Id="PolicyProfile">
            <DisplayName>PolicyProfile</DisplayName>
            <Protocol Name="OpenIdConnect" />
            <OutputClaims>
                <!-- <OutputClaim ClaimTypeReferenceId="user_agent"   /> -->
                <OutputClaim ClaimTypeReferenceId="displayName" />
                <OutputClaim ClaimTypeReferenceId="givenName" />
                <OutputClaim ClaimTypeReferenceId="surname" />
                <OutputClaim ClaimTypeReferenceId="email" />
                <OutputClaim ClaimTypeReferenceId="correlationId" DefaultValue="{Context:CorrelationId}" />
                <OutputClaim ClaimTypeReferenceId="data.sent_timestamp" PartnerClaimType="data.sent_timestamp" />
                <OutputClaim ClaimTypeReferenceId="data.activity.ip.frequency" PartnerClaimType="data.activity.ip.frequency" />
                <OutputClaim ClaimTypeReferenceId="data.activity.ip.lastseen" PartnerClaimType="data.activity.ip.lastseen" />
                <OutputClaim ClaimTypeReferenceId="data.activity.ip.email_count" PartnerClaimType="data.activity.ip.email_count" />
                <OutputClaim ClaimTypeReferenceId="data.activity.email.ip_count" PartnerClaimType="data.activity.email.ip_count" />
                <OutputClaim ClaimTypeReferenceId="data.activity.email.lastseen" PartnerClaimType="data.activity.email.lastseen" />
                <OutputClaim ClaimTypeReferenceId="data.activity.email.frequency" PartnerClaimType="data.activity.email.frequency" />
                <OutputClaim ClaimTypeReferenceId="data.activity.emailip.frequency" PartnerClaimType="data.activity.emailip.frequency" />
                <OutputClaim ClaimTypeReferenceId="data.activity.emailip.lastseen" PartnerClaimType="data.activity.emailip.lastseen" />
                <OutputClaim ClaimTypeReferenceId="data.activity.emailip.match" PartnerClaimType="data.activity.emailip.match" />
                <OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_email" PartnerClaimType="data.activity.emailip.rank_email" />
                <OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_ip" PartnerClaimType="data.activity.emailip.rank_ip" />
                <OutputClaim ClaimTypeReferenceId="data.signals.trust" PartnerClaimType="data.signals.trust" />
                <OutputClaim ClaimTypeReferenceId="data.signals.info" PartnerClaimType="data.signals.info" />
                <OutputClaim ClaimTypeReferenceId="data.signals.risk" PartnerClaimType="data.signals.risk" />
                <OutputClaim ClaimTypeReferenceId="data.network.company_name" PartnerClaimType="data.network.company_name" />
                <OutputClaim ClaimTypeReferenceId="data.network.crawler_name" PartnerClaimType="data.network.crawler_name" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_corporate" PartnerClaimType="data.network.is_corporate" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_education" PartnerClaimType="data.network.is_education" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_hosting" PartnerClaimType="data.network.is_hosting" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_mobile" PartnerClaimType="data.network.is_mobile" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_proxy" PartnerClaimType="data.network.is_proxy" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_tor" PartnerClaimType="data.network.is_tor" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_capable" PartnerClaimType="data.network.is_vpn_capable" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_confirmed" PartnerClaimType="data.network.is_vpn_confirmed" />
                <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_suspect" PartnerClaimType="data.network.is_vpn_suspect" />
                <OutputClaim ClaimTypeReferenceId="data.network.isp_name" PartnerClaimType="data.network.isp_name" />
                <OutputClaim ClaimTypeReferenceId="data.network.vpn_name" PartnerClaimType="data.network.vpn_name" />
                <OutputClaim ClaimTypeReferenceId="data.geo.city" PartnerClaimType="data.geo.city" />
                <OutputClaim ClaimTypeReferenceId="data.geo.country" PartnerClaimType="data.geo.country" />
                <OutputClaim ClaimTypeReferenceId="data.geo.lat" PartnerClaimType="data.geo.lat" />
                <OutputClaim ClaimTypeReferenceId="data.geo.long" PartnerClaimType="data.geo.long" />
                <OutputClaim ClaimTypeReferenceId="data.geo.state" PartnerClaimType="data.geo.state" />
                <OutputClaim ClaimTypeReferenceId="data.device.ua_brand" PartnerClaimType="data.device.ua_brand" />
                <OutputClaim ClaimTypeReferenceId="data.device.ua_browser" PartnerClaimType="data.device.ua_browser" />
                <OutputClaim ClaimTypeReferenceId="data.device.ua_device_type" PartnerClaimType="data.device.ua_device_type" />
                <OutputClaim ClaimTypeReferenceId="data.device.ua_name" PartnerClaimType="data.device.ua_name" />
                <OutputClaim ClaimTypeReferenceId="data.device.ua_os" PartnerClaimType="data.device.ua_os" />
                <OutputClaim ClaimTypeReferenceId="data.device.ua_type" PartnerClaimType="data.device.ua_type" />
                <OutputClaim ClaimTypeReferenceId="data.device.ua_version" PartnerClaimType="data.device.ua_version" />
                <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
                <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
            </OutputClaims>
            <SubjectNamingInfo ClaimType="sub" />
        </TechnicalProfile>
    </RelyingParty>

Krok 10: Prześlij zasady niestandardowe

  1. Zaloguj się do witryny Azure Portal.

  2. Jeśli masz dostęp do wielu dzierżaw, wybierz ikonę Ustawienia w górnym menu, aby przełączyć się na dzierżawę Azure AD B2C z menu Katalogi + subskrypcje.

  3. W witrynie Azure Portal wyszukaj i wybierz pozycję Azure AD B2C.

  4. W sekcji Zasady wybierz pozycję Identity Experience Framework.

  5. Wybierz Załaduj zasady niestandardowe, a następnie załaduj dwa zmienione pliki zasad w następującej kolejności: zasady rozszerzenia, na przykład TrustFrameworkBase.xml, a następnie zasady strony zależnej, takie jak B2C_1A_signup.

Krok 11. Testowanie zasad niestandardowych

  1. Wybierz zasady zaufanej strony, na przykład B2C_1A_signup.

  2. W polu Aplikacja wybierz wcześniej zarejestrowaną aplikację internetową. Adres URL odpowiedzi powinien zawierać wartość https://jwt.ms.

  3. Wybierz przycisk Uruchom teraz .

  4. Zasady rejestracji powinny natychmiast wywołać deduce. Jeśli używane jest logowanie, wybierz Deduce, aby zalogować się za pomocą Deduce.

Jeśli proces logowania zakończy się pomyślnie, przeglądarka zostanie przekierowana do https://jwt.ms, gdzie wyświetlana jest zawartość tokenu zwróconego przez Azure AD B2C.

Następne kroki

Aby uzyskać dodatkowe informacje, zapoznaj się z następującymi artykułami: