Запретить / запретить вход в систему для пользователя на основе атрибута расширения - PullRequest
1 голос
/ 22 марта 2019

У меня есть собственный атрибут, который я хотел бы использовать при аутентификации. Например, у меня есть другой атрибут расширения статуса, который может иметь возможные значения, такие как expired / заблокированный / неактивный / активный При создании пользователя я буду следить за тем, чтобы для этого было указано значение.

Во время входа в систему я хотел бы также рассмотреть этот атрибут расширения. Возможно, что пользователь вводит правильный пароль, но только потому, что его статус атрибута расширения имеет значение expired / заблокировано / неактивно, я хотел бы отказать в входе в систему и выдать настраиваемое локализованное сообщение об ошибке.

Примечание : я использую пользовательские политики.

1 Ответ

3 голосов
/ 23 марта 2019

Вы можете построить преобразования утверждений, чтобы определить, активирована ли учетная запись пользователя, и, если нет, отобразить сообщение об ошибке.

Во-первых, вы должны объявить тип утверждения, который показывает, активирована ли учетная запись пользователя:

<ClaimType Id="accountActivated">
  <DisplayName>Account Activated</DisplayName>
  <DataType>boolean</DataType>
</ClaimType>

Далее необходимо объявить a CompareClaimToValue преобразование утверждений , чтобы определить, установлено ли для пользовательского атрибута значение «Активно»:

<ClaimsTransformation Id="CheckAccountActivated" TransformationMethod="CompareClaimToValue">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_AccountStatus" TransformationClaimType="inputClaim1" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="compareTo" DataType="string" Value="Active" />
    <InputParameter Id="operator" DataType="string" Value="equal" />
    <InputParameter Id="ignoreCase" DataType="string" Value="true" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="accountActivated" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

Далее вы должны объявить AssertBooleanClaimIsEqualToValue преобразование утверждений , чтобы убедиться, что учетная запись пользователя активирована:

<ClaimsTransformation Id="EnsureAccountActivated" TransformationMethod="AssertBooleanClaimIsEqualToValue">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="accountActivated" TransformationClaimType="inputClaim" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="valueToCompareTo" DataType="boolean" Value="true" />
  </InputParameters>
</ClaimsTransformation>

Далее вы должны вызвать EnsureAccountAcactive требует преобразований из копии AAD-UserReadUsingObjectId теста технического профиля, что учетная запись пользователя активирована:

<TechnicalProfile Id="AAD-UserReadUsingObjectId-EnsureAccountActivated">
  <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="CheckAccountActivated" />
    <OutputClaimsTransformation ReferenceId="EnsureAccountActivated" />
  </OutputClaimsTransformations>
  <IncludeTechnicalProfile ReferenceId="AAD-UserReadUsingObjectId" />
</TechnicalProfile>

Наконец, вы должны вызвать AAD-UserReadUsingObjectId-EnsureAccountActivation технический профиль из копии SelfAsserted-LocalAccountSignin-Email technПрофиль, отображающий сообщение об ошибке:

<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email-EnsureAccountActivated">
  ...
  <Metadata>
    ...
    <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Whoops, your e-mail address hasn't been verified, contact Support.</Item>
  </Metadata>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="login-NonInteractive" />
    <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingObjectId-EnsureAccountActivated" />
  </ValidationTechnicalProfiles>
  ...
</TechnicalProfile>

ОБНОВЛЕНИЕ: 3 апреля 2019 г.

Это сработало абсолютно нормально, но нужна некоторая помощь в локализации пользовательской ошибки.сообщение.

Вы можете настроить сообщение об ошибке, используя localization .

Первый шаг - включить локализацию для английского и любого другогоподдерживаемые языки:

<BuildingBlocks>
  ...
  <ContentDefinitions />
  <Localization>
    <SupportedLanguages DefaultLanguage="en">
      <SupportedLanguage>en</SupportedLanguage>
      <SupportedLanguage>es</SupportedLanguage>
    </SupportedLanguages>
  </Localization>
</BuildingBlocks>

Второй шаг - определить локализованные строки для каждого поддерживаемого языка для определения страницы, связанной с SelfAsserted-LocalAccountSignin-Email-EnsureAccountActivation технический профиль:

<BuildingBlocks>
  ...
  <Localization>
    <SupportedLanguages />
    <LocalizedResources Id="api.signuporsignin.en">
      <LocalizedStrings>
         <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Whoops, your e-mail address hasn't been verified, contact Support.</LocalizedString>
      </LocalizedStrings>
    </LocalizedResources>
    <LocalizedResources Id="api.signuporsignin.es">
      <LocalizedStrings>
         <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Vaya, su dirección de correo electrónico no ha sido verificada, contacte a Soporte.</LocalizedString>
      </LocalizedStrings>
    </LocalizedResources>
  </Localization>
</BuildingBlocks>

(я не говорю по-испански, поэтому извиняюсь за неправильный перевод.)

Последний шаг - объявление ссылок от определения страницы до локализованных ресурсов:

<BuildingBlocks>
  ...
  <ContentDefinitions>
    <ContentDefinition Id="api.signuporsignin">
      ...
      <LocalizedResourcesReferences MergeBehavior="Prepend">
         <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.signuporsignin.en" />
         <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.signuporsignin.es" />
      </LocalizedResourcesReferences>
    </ContentDefinition>
  </ContentDefinitions>
  <Localization />
</BuildingBlocks>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...