Azure Active Directory B2C'de parola sıfırlama akışı ayarlama

Başlamadan önce, ayarladığınız ilke türünü seçmek için İlke türü seçin seçicisini kullanın. Azure Active Directory B2C, kullanıcıların uygulamalarınızla nasıl etkileşim kurduğunu tanımlamak için iki yöntem sunar: önceden tanımlanmış kullanıcı akışları veya tam olarak yapılandırılabilir özel ilkeler aracılığıyla. Bu makalede gereken adımlar her yöntem için farklıdır.

Kaydolma ve oturum açma yolculuğunda kullanıcı, Parolanızı mı unuttunuz? bağlantısını kullanarak kendi parolasını sıfırlayabilir. Bu self servis parola sıfırlama akışı, Azure Active Directory B2C'de (Azure AD B2C) oturum açma için bir e-posta adresi veya parola içeren bir kullanıcı adı kullanan yerel hesaplar için geçerlidir.

Parola sıfırlama akışı aşağıdaki adımları içerir:

  1. Kaydolma ve oturum açma sayfasında kullanıcı Parolanızı mı unuttunuz? bağlantısını seçer. Azure AD B2C, parola sıfırlama akışını başlatır.
  2. Görüntülenen sonraki iletişim kutusunda kullanıcı e-posta adresini girer ve doğrulama kodu gönder'i seçer. Azure AD B2C kullanıcının e-posta hesabına bir doğrulama kodu gönderir. Kullanıcı doğrulama kodunu e-postadan kopyalar, Azure AD B2C parola sıfırlama iletişim kutusuna kodu girer ve ardından Kodu doğrula'yı seçer.
  3. Kullanıcı daha sonra yeni bir parola girebilir. (E-posta doğrulandıktan sonra, kullanıcı yine de E-postayı değiştir düğmesini seçebilir; bkz. E-postayı değiştir düğmesini gizleme.)

Parola sıfırlama akışında üç iletişim kutusunu gösteren diyagram.

İpucu

Kullanıcı, parolasını unutur ve sıfırlamak isterse self servis parola sıfırlama akışını kullanarak parolasını değiştirebilir. Aşağıdaki kullanıcı akışı seçeneklerinden birini de seçebilirsiniz:

  • Kullanıcı parolasını biliyorsa ve parolayı değiştirmek istiyorsa parola değiştirme akışı kullanın.
  • Bir kullanıcıyı parolasını sıfırlamaya zorlamak istiyorsanız (örneğin, ilk kez oturum açtıklarında, parolaları bir yönetici tarafından sıfırlandığında veya rastgele parolalarla Azure AD B2C'ye geçirildikten sonra), zorla parola sıfırlama akışı kullanın.

selfAsserted.html'daki E-postayı değiştir düğmesinin varsayılan adı değişiklik bildirimleridir. Düğme adını bulmak için kaydolma sayfasında , İncele gibi bir tarayıcı aracı kullanarak sayfa kaynağını inceleyin.

Önkoşullar

E-postayı değiştir düğmesini gizleme

E-posta doğrulandıktan sonra, kullanıcı yine e-postayı değiştir'i seçebilir, başka bir e-posta adresi girebilir ve ardından e-posta doğrulamasını yineleyebilir. E-postayı değiştir düğmesini gizlemeyi tercih ederseniz, CSS'yi iletişim kutusundaki ilişkili HTML öğelerini gizleyecek şekilde değiştirebilirsiniz. Örneğin, selfAsserted.html aşağıdaki CSS girişini ekleyebilir ve HTML şablonlarını kullanarak kullanıcı arabirimini özelleştirebilirsiniz:

<style type="text/css">
   .changeClaims
   {
     visibility: hidden;
   }
</style>

Yeni parola sıfırlama deneyimi artık kaydolma veya oturum açma ilkesinin bir parçasıdır. Kullanıcı Parolanızı mı unuttunuz? bağlantısını seçtiğinde, hemen Parolayı Unuttum deneyimine gönderilir. Uygulamanızın artık AADB2C90118 hata kodunu işlemesi gerekmez ve parola sıfırlama için ayrı bir ilkeye ihtiyacınız yoktur.

Self servis parola sıfırlama deneyimi, Oturum açma (Önerilen) veya Kaydolma ve oturum açma (Önerilen) kullanıcı akışları için yapılandırılabilir. Bu kullanıcı akışlarından birini ayarlamadıysanız bir kaydolma veya oturum açma kullanıcı akışı oluşturun.

Kaydolma veya oturum açma kullanıcı akışı için self servis parola sıfırlamayı ayarlamak için:

  1. Azure Portal’ında oturum açın.
  2. Portal araç çubuğunda Dizinler + Abonelikler simgesini seçin.
  3. Portal ayarlarında | Dizinler + abonelikler bölmesi, dizin adı listesinde Azure AD B2C dizininizi bulun ve ardından Değiştir'i seçin.
  4. Azure portal Azure AD B2C'yi arayın ve seçin.
  5. Kullanıcı akışları'ı seçin.
  6. Özelleştirmek istediğiniz bir kaydolma veya oturum açma kullanıcı akışı ( Önerilen türünde) seçin.
  7. Ayarlar'ın altındaki menüde Özellikler'i seçin.
  8. Parola yapılandırması'nın altında Self servis parola sıfırlama'yı seçin.
  9. Kaydet’i seçin.
  10. Özelleştir'in altındaki sol menüde Sayfa düzenleri'ni seçin.
  11. Sayfa Düzeni Sürümü'nde2.1.3 veya üzerini seçin.
  12. Kaydet’i seçin.

Aşağıdaki bölümlerde, bir özel ilkeye self servis parola deneyiminin nasıl ekleneceği açıklanmaktadır. Örnek, özel ilke başlangıç paketine dahil edilen ilke dosyalarını temel alır.

İpucu

GitHub'da Kaydolma ve Parola Sıfırlama ile Oturum Açma ilkesinin eksiksiz bir örneğini bulabilirsiniz.

İlkeye kullanıcının Parolanızı mı unuttunuz? bağlantısını seçtiğini belirtmek için bir Boole talebi tanımlayın. Kullanıcı yolculuğunu Parolayı Unuttum teknik profiline yönlendirmek için talebi kullanın. Talep belirteci de verebilir, böylece uygulama kullanıcının Parolayı Unuttum kullanıcı akışını kullanarak oturum açtığını algılar.

Talep şemanızda taleplerinizi bildirin. İlkenizin uzantılar dosyasını açın, örneğin, SocialAndLocalAccounts/TrustFrameworkExtensions.xml.

  1. BuildingBlocks öğesini arayın. Öğe yoksa ekleyin.

  2. ClaimsSchema öğesini bulun. Öğe yoksa ekleyin.

  3. ClaimsSchema öğesine aşağıdaki talebi ekleyin.

    <!-- 
    <BuildingBlocks>
      <ClaimsSchema> -->
        <ClaimType Id="isForgotPassword">
          <DisplayName>isForgotPassword</DisplayName>
          <DataType>boolean</DataType>
          <AdminHelpText>Whether the user has selected Forgot your Password</AdminHelpText>
        </ClaimType>
      <!--
      </ClaimsSchema>
    </BuildingBlocks> -->
    

Sayfa düzeni sürümünü yükseltme

Kaydolma veya oturum açma yolculuğunda self servis parola sıfırlama akışını etkinleştirmek için sayfa düzeni sürüm 2.1.2 gereklidir. Sayfa düzeni sürümünü yükseltmek için:

  1. İlkenizin temel dosyasını açın, örneğin, SocialAndLocalAccounts/TrustFrameworkBase.xml.

  2. BuildingBlocks öğesini arayın. Öğe yoksa ekleyin.

  3. ContentDefinitions öğesini bulun. Öğe yoksa ekleyin.

  4. ContentDefinition öğesi içindeki DataURI öğesini kimliğine api.signuporsigninsahip olacak şekilde değiştirin:

    <!-- 
    <BuildingBlocks>
      <ContentDefinitions> -->
        <ContentDefinition Id="api.signuporsignin">
          <DataUri>urn:com:microsoft:aad:b2c:elements:contract:unifiedssp:2.1.2</DataUri>
        </ContentDefinition>
      <!-- 
      </ContentDefinitions>
    </BuildingBlocks> -->
    

Teknik profilleri ekleme

Talep dönüştürme teknik profili, talepe erişir isForgotPassword . Teknik profile daha sonra başvurabilirsiniz. Çağrıldığında, talebin isForgotPassword değerini olarak trueayarlar.

  1. İlkenizin uzantılar dosyasını açın, örneğin, SocialAndLocalAccounts/TrustFrameworkExtensions.xml.
  2. ClaimsProviders öğesini bulun (öğe yoksa oluşturun) ve ardından aşağıdaki talep sağlayıcısını ekleyin:
<!-- 
<ClaimsProviders> -->
  <ClaimsProvider>
    <DisplayName>Local Account</DisplayName>
    <TechnicalProfiles>
      <TechnicalProfile Id="ForgotPassword">
        <DisplayName>Forgot your password?</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="isForgotPassword" DefaultValue="true" AlwaysUseDefaultValue="true"/>
        </OutputClaims>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
      <TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
        <Metadata>
          <Item Key="setting.forgotPasswordLinkOverride">ForgotPasswordExchange</Item>
        </Metadata>
      </TechnicalProfile>
      <TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId">
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
      </TechnicalProfile>
    </TechnicalProfiles>
  </ClaimsProvider>
<!-- 
</ClaimsProviders> -->

SelfAsserted-LocalAccountSignin-Email teknik profil ayarı.forgotPasswordLinkOverride, kullanıcı yolculuğunuzda yürütülen parola sıfırlama talep değişimini tanımlar.

Kullanıcının SSO koşulları altında sonraki oturum açmaları başarıyla önceden oluşturması için LocalAccountWritePasswordUsingObjectId teknik profili UseTechnicalProfileForSessionManagementSM-AAD oturum yöneticisi gereklidir.

Parola sıfırlama alt yolculuğunu ekleme

Kullanıcı artık kullanıcı yolculuğunuzda oturum açabilir, kaydolabilir ve parola sıfırlama gerçekleştirebilir. Kullanıcı yolculuğunu daha iyi düzenlemek için, parola sıfırlama akışını işlemek için bir alt yolculuk kullanabilirsiniz.

Alt yolculuk, kullanıcı yolculuğundan çağrılır ve kullanıcıya parola sıfırlama deneyimini sunan belirli adımları gerçekleştirir. Alt yolculuk tamamlandığında denetimin Call alt yolculuğu başlatan düzenleme adımına döndürülmesi için tür alt yolculuğunu kullanın.

  1. İlkenizin SocialAndLocalAccounts/TrustFrameworkExtensions.xmlgibi uzantılar dosyasını açın.
  2. SubJourneys öğesini bulun. Öğe yoksa, Kullanıcı Yolculukları öğesinin arkasına ekleyin. Ardından aşağıdaki alt yolculuğu ekleyin:
<!--
<SubJourneys>-->
  <SubJourney Id="PasswordReset" Type="Call">
    <OrchestrationSteps>
      <!-- Validate user's email address. -->
      <OrchestrationStep Order="1" Type="ClaimsExchange">
        <ClaimsExchanges>
          <ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingEmailAddress" />
        </ClaimsExchanges>
      </OrchestrationStep>

      <!-- Collect and persist a new password. -->
      <OrchestrationStep Order="2" Type="ClaimsExchange">
        <ClaimsExchanges>
          <ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="LocalAccountWritePasswordUsingObjectId" />
        </ClaimsExchanges>
      </OrchestrationStep>
    </OrchestrationSteps>
  </SubJourney>
<!--
</SubJourneys>-->

Kullanıcı yolculuğunuzu hazırlama

Ardından, Parolanızı mı unuttunuz? bağlantısını Parolayı Unuttunuz alt yolculuğuna bağlamak için CombinedSignInAndSignUp adımının ClaimsProviderSelection öğesinde Parolayı Unuttum alt yolculuk kimliğine başvurmanız gerekir.

CombinedSignInAndSignUp adımına sahip olan kendi özel kullanıcı yolculuğunuz yoksa, var olan bir kaydolma veya oturum açma kullanıcı yolculuğunu yinelemek için aşağıdaki adımları tamamlayın. Aksi takdirde sonraki bölüme geçin.

  1. Başlangıç paketinde SocialAndLocalAccounts/TrustFrameworkBase.xmlgibi TrustFrameworkBase.xml dosyasını açın.
  2. öğesini içeren Id="SignUpOrSignIn"UserJourney öğesinin tüm içeriğini bulun ve kopyalayın.
  3. SocialAndLocalAccounts/TrustFrameworkExtensions.xmlgibi TrustFrameworkExtensions.xml dosyasını açın ve UserJourneys öğesini bulun. Öğesi yoksa oluşturun.
  4. 2. adımda kopyaladığınız UserJourney öğesinin tüm içeriğini yapıştırarak UserJourneys öğesinin alt öğesini oluşturun.
  5. Kullanıcı yolculuğunun kimliğini yeniden adlandırın. Örneğin, Id="CustomSignUpSignIn".

Kullanıcı yolculuğunuzda, Parolayı Unuttum alt yolculuğunu ClaimsProviderSelection olarak temsil edebilirsiniz. Bu öğeyi ekleyerek Parolanızı mı unuttunuz? bağlantısını Parolayı Unuttunuz alt yolculuğuna bağlarsınız.

  1. SocialAndLocalAccounts/TrustFrameworkExtensions.xmlgibi TrustFrameworkExtensions.xml dosyasını açın.

  2. Kullanıcı yolculuğunda, veya Type="ClaimsProviderSelection"içeren Type="CombinedSignInAndSignUp" düzenleme adımı öğesini bulun. Bu genellikle ilk düzenleme adımıdır. ClaimsProviderSelections öğesi, kullanıcının oturum açmak için kullanabileceği kimlik sağlayıcılarının listesini içerir. Aşağıdaki satırı ekleyin:

    <ClaimsProviderSelection TargetClaimsExchangeId="ForgotPasswordExchange" />
    
  3. Sonraki düzenleme adımında, aşağıdaki satırı ekleyerek claimsExchange öğesi ekleyin:

    <ClaimsExchange Id="ForgotPasswordExchange" TechnicalProfileReferenceId="ForgotPassword" />
    
  4. Geçerli adımla sonraki adım arasına aşağıdaki düzenleme adımını ekleyin. Eklediğiniz yeni düzenleme adımı isForgotPassword talebi olup olmadığını denetler. Talep varsa parola sıfırlama alt yolculuğunu çağırır.

    <OrchestrationStep Order="3" Type="InvokeSubJourney">
      <Preconditions>
        <Precondition Type="ClaimsExist" ExecuteActionsIf="false">
          <Value>isForgotPassword</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
      <JourneyList>
        <Candidate SubJourneyReferenceId="PasswordReset" />
      </JourneyList>
    </OrchestrationStep>
    
  5. Yeni düzenleme adımını ekledikten sonra, 1'den N'ye kadar herhangi bir tamsayı atlamadan adımları sırayla yeniden numaralandırın.

Yürütülecek kullanıcı yolculuğunu ayarlama

Artık bir kullanıcı yolculuğunu değiştirdiğinize veya oluşturduğunuza göre Bağlı Olan Taraf bölümünde B2C'nin bu özel ilke için yürüteceği yolculuğu Azure AD belirtin.

  1. SocialAndLocalAccounts/SignUpOrSignin.xmlgibi Bağlı Olan Taraf öğesini içeren dosyayı açın.

  2. RelyingParty öğesinde DefaultUserJourney öğesini bulun.

  3. DefaultUserJourney ReferenceId değerini ClaimsProviderSelections eklediğiniz kullanıcı yolculuğunun kimliğiyle eşleşecek şekilde güncelleştirin.

<RelyingParty>
  <DefaultUserJourney ReferenceId="CustomSignUpSignIn" />
  ...
</RelyingParty>

Uygulamanıza Parolayı Unuttum akışını gösterme

Uygulamanızın kullanıcının Parolayı Unuttum kullanıcı akışını kullanarak oturum açıp açmadığını algılaması gerekebilir. isForgotPassword talebi, bunu yaptığını gösteren bir Boole değeri içerir. Talep, uygulamanıza gönderilen belirteçte yayımlanabilir. Gerekirse, Bağlı Olan Taraf bölümündeki çıkış taleplerine isForgotPassword ekleyin. Uygulamanız, kullanıcının parolasını sıfırlayıp sıfırlamadığını belirlemek için isForgotPassword talebine bakabilir.

<RelyingParty>
  <OutputClaims>
    ...
    <OutputClaim ClaimTypeReferenceId="isForgotPassword" DefaultValue="false" />
  </OutputClaims>
</RelyingParty>

Özel ilkeyi karşıya yükleme

  1. Azure Portal’ında oturum açın.
  2. Portal araç çubuğunda Dizinler + Abonelikler simgesini seçin.
  3. Portal ayarları | Dizinler + abonelikler bölmesi, Dizin adı listesinde Azure AD B2C dizininizi bulun ve ardından Değiştir'i seçin.
  4. Azure portal Azure AD B2C'yi arayın ve seçin.
  5. İlkeler'in altındaki menüde Kimlik Deneyimi Çerçevesi'ni seçin.
  6. Özel ilkeyi karşıya yükle'yi seçin. Aşağıdaki sırayla, değiştirdiğiniz ilke dosyalarını karşıya yükleyin:
    1. İlkenizin temel dosyası, örneğin TrustFrameworkBase.xml.
    2. Uzantı ilkesi, örneğin TrustFrameworkExtensions.xml.
    3. Bağlı olan taraf ilkesi, örneğin SignUpSignIn.xml.

Parola sıfırlama akışını test edin

  1. Test etmek istediğiniz bir kaydolma veya oturum açma kullanıcı akışı (Önerilen tür) seçin.
  2. Kullanıcı akışını çalıştır'ı seçin.
  3. Uygulama için daha önce kaydettiğiniz webapp1 adlı web uygulamasını seçin. Yanıt URL'si göstermelidirhttps://jwt.ms.
  4. Kullanıcı akışını çalıştır'ı seçin.
  5. Kaydolma veya oturum açma sayfasında Parolanızı mı unuttunuz? öğesini seçin.
  6. Daha önce oluşturduğunuz hesabın e-posta adresini doğrulayın ve Devam'ı seçin.
  7. Gösterilen iletişim kutusunda, kullanıcının parolasını değiştirin ve ardından Devam'ı seçin. Belirteç öğesine https://jwt.ms döndürülür ve tarayıcı tarafından görüntülenir.
  8. Dönüş belirtecinin isForgotPassword talep değerini denetleyin. Varsa ve olarak ayarlanırsa true, kullanıcı parolayı sıfırlamıştır.

Parola sıfırlama ilkesi (eski)

Self servis parola sıfırlama deneyimi etkin değilse, bu bağlantının seçilmesi parola sıfırlama kullanıcı akışını otomatik olarak tetiklemez. Bunun yerine hata kodu AADB2C90118 uygulamanıza döndürülür. Uygulamanızın B2C parola sıfırlama kullanıcı akışının kimliğini doğrulamak için kimlik doğrulama kitaplığını yeniden başlatarak bu hata kodunu işlemesi Azure AD.

Aşağıdaki diyagramda işlem gösterilmiştir:

  1. Uygulamada kullanıcı Oturum aç'ı seçer. Uygulama bir yetkilendirme isteği başlatır ve kullanıcının oturum açmayı bitirebilmesi için Azure AD B2C'ye yönlendirir. Yetkilendirme isteği, B2C_1_signup_signin gibi bir kaydolma veya oturum açma ilkesi adı belirtir.

  2. Kullanıcı Parolanızı mı unuttunuz? bağlantısını seçer. Azure AD B2C, hata kodunu uygulamaya döndürürAADB2C90118.

  3. Uygulama hata kodunu işler ve yeni bir yetkilendirme isteği başlatır. Yetkilendirme isteği, B2C_1_pwd_reset gibi parola sıfırlama ilkesi adını belirtir.

    Eski parola sıfırlama kullanıcı akışını gösteren diyagram.

Kullanıcı akışlarının nasıl bağlantı oluşturduğunu gösteren temel bir ASP.NET örneği görebilirsiniz.

Parola sıfırlama kullanıcı akışı oluşturma

Uygulama kullanıcılarınızın parolalarını sıfırlamasına izin vermek için parola sıfırlama kullanıcı akışı oluşturun:

  1. Azure portal Azure AD B2C kiracısına genel bakış'a gidin.
  2. soldaki menüde İlkeler'in altında Kullanıcı akışları'nı ve ardından Yeni kullanıcı akışı'nı seçin.
  3. Kullanıcı akışı oluştur bölümünde Parola sıfırlama kullanıcı akışını seçin.
  4. Sürüm seçin'in altında Önerilen'i ve ardından Oluştur'u seçin.
  5. Ad alanına kullanıcı akışı için bir ad girin. Örneğin , passwordreset1.
  6. Kimlik sağlayıcıları için Parolayı kullanıcı adı kullanarak sıfırla'yı veya E-posta adresini kullanarak parolayı sıfırla'yı etkinleştirin.
  7. Çok faktörlü kimlik doğrulaması altında, kullanıcıların kimliklerini ikinci bir kimlik doğrulama yöntemi kullanarak doğrulamasını zorunlu kılmak istiyorsanız, yöntem türünü ve çok faktörlü kimlik doğrulamasının ne zaman zorunlu kılındığını seçin. Daha fazla bilgi edinin.
  8. Koşullu erişim'in altında, Azure AD B2C kiracınız için koşullu erişim ilkeleri yapılandırdıysanız ve bunları bu kullanıcı akışında kullanmak istiyorsanız Koşullu erişim ilkelerini zorla onay kutusunu seçin. İlke adı belirtmeniz gerekmez. Daha fazla bilgi edinin.
  9. Uygulama talepleri'nin altında Daha fazla göster'i seçin. Uygulamanıza geri gönderilen yetkilendirme belirteçlerinde döndürülmesini istediğiniz talepleri seçin. Örneğin, Kullanıcının Nesne Kimliği’ni seçin.
  10. Tamam’ı seçin.
  11. Kullanıcı akışını eklemek için Oluştur'u seçin. Ada otomatik olarak bir B2C_1 öneki eklenir.

Kullanıcı akışını test edin

Kullanıcı akışını test etmek için:

  1. Oluşturduğunuz kullanıcı akışını seçin. Kullanıcı akışına genel bakış sayfasında Kullanıcı akışını çalıştır'ı seçin.
  2. Uygulama için, daha önce kaydettiyseniz webapp1 adlı uygulama gibi test etmek istediğiniz web uygulamasını seçin. Yanıt URL'si olmalıdırhttps://jwt.ms.
  3. Kullanıcı akışını çalıştır'ı seçin, parolasını sıfırlamak istediğiniz hesabın e-posta adresini doğrulayın ve ardından Devam'ı seçin.
  4. Parolayı değiştirip Devam'ı seçin. Belirteç öğesine https://jwt.ms döndürülür ve tarayıcı tarafından görüntülenir.

Parola sıfırlama ilkesi oluşturma

Özel ilkeler, kullanıcı yolculuklarını tanımlamak için Azure AD B2C kiracınıza yüklediğiniz xml dosyaları kümesidir. Kaydolma ve oturum açma, parola sıfırlama ve profil düzenleme ilkeleri gibi önceden oluşturulmuş çeşitli ilkelere sahip başlangıç paketleri sağlıyoruz. Daha fazla bilgi için bkz. Azure AD B2C'de özel ilkeleri kullanmaya başlama.

B2C kullanıcı akışları ve özel ilkeler Azure AD sorunlarını giderme

Uygulamanızın Azure B2C hizmetinden gelen bazı hataları işlemesi gerekir. B2C Azure AD nin kullanıcı akışları ve özel ilkeleriyle ilgili sorunları gidermeyi öğrenin.

Sonraki adımlar

Zorla parola sıfırlama ayarlayın.

Katıştırılmış parola sıfırlama ile kaydolma ve Oturum açma.