WSO2 Identity Server 5.10.0 — невозможно выполнить MFA на основе EmailOTP

Я включил поставщика удостоверений EmailOTP, используя сервер удостоверений WSO2 в качестве поставщика электронной почты.

В моем поставщике услуг я включил EmailOTP в качестве второго шага аутентификации.

Приложение Angular UI — это мой внешний интерфейс, когда я указываю имя пользователя/пароль на странице входа (пользователь OpenId Connect), код авторизации генерируется, но второй шаг не вызывается, т. е. страница OTP не отображается и электронная почта не отправляется получателю с OTP.

Я выполнил шаги, упомянутые здесь, за исключением того, что сделал Gmail поставщиком удостоверений.

Конфигурация OpenIdConnect:

Конфигурация локальной и исходящей аутентификации:

Конфигурация EmailOTP IDP (не использовала Gmail или SendGrid):

Конфигурация адаптера электронной почты и аутентификатора:

[output_adapter.email]
from_address= "[email protected]"
username= "[email protected]"
password= "password"
hostname= "smpt.hostname"
port= 25
enable_start_tls= false
enable_authentication= true

[authentication.authenticator.basic.parameters]
showAuthFailureReason = true

[authentication.authenticator.email_otp]
name  = "EmailOTP"
enable=true

[authentication.authenticator.email_otp.parameters]
EMAILOTPAuthenticationEndpointURL = "https://10.201.8.13:5004/emailotpauthenticationendpoint/emailotp.jsp"
EmailOTPAuthenticationEndpointErrorPage = "https://10.201.8.13:5004/emailotpauthenticationendpoint/emailotpError.jsp"
EmailAddressRequestPage = "https://10.201.8.13:5004/emailotpauthenticationendpoint/emailAddress.jsp"
usecase = "local"
secondaryUserstore = "primary"
EMAILOTPMandatory = false
sendOTPToFederatedEmailAttribute = false
federatedEmailAttributeKey = "email"
EmailOTPEnableByUserClaim = true
CaptureAndUpdateEmailAddress = true
showEmailAddressInUI = true
useEventHandlerBasedEmailSender = true

Конфигурация аутентификации на основе скрипта:

var onLoginRequest = function(context) {
    executeStep(1);
    executeStep(2);
};

Конфигурация подключения OpenId.

https://is.docs.wso2.com/en/5.10.0/learn/configuring-email-otp/#configuring-email-otp

Сведения о конечной точке:

https://localhost:5004/oauth2/authorize?response_type=code&scope=openid&redirect_uri=http://localhost&client_id=<client_id>&code_challenge=<code_challenge>&code_challenge_method=S256&sectoken=<sec_token>

Ошибка домена арендатора:

Пользователь домена арендатора рассматривается как пользователь домена carbon.super.

TID: [-1234] [] [2021-02-01 17:13:47,683] [85d31877-3090-4139-9efb-d40f85c2e2eb] DEBUG {org.wso2.carbon.identity.authenticator.emailotp.EmailOTPAuthenticator}
    - OTP Expiration Time not specified default value will be used
 TID: [-1234] [] [2021-02-01 17:13:47,684] [85d31877-3090-4139-9efb-d40f85c2e2eb] ERROR {org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultRequestCoordinator}
    - Exception in Authentication Framework java.lang.NullPointerException
                at org.wso2.carbon.identity.application.authentication.framework.AbstractApplicationAuthenticator.publishAuthenticationStepAttempt(AbstractApplicationAuthenticator.java:170)
                at org.wso2.carbon.identity.application.authentication.framework.AbstractApplicationAuthenticator.process(AbstractApplicationAuthenticator.java:94)
                at org.wso2.carbon.identity.authenticator.emailotp.EmailOTPAuthenticator.process(EmailOTPAuthenticator.java:139)
                at org.wso2.carbon.identity.application.authentication.framework.handler.step.impl.DefaultStepHandler.doAuthentication(DefaultStepHandler.java:506)
                at org.wso2.carbon.identity.application.authentication.framework.handler.step.impl.DefaultStepHandler.handleResponse(DefaultStepHandler.java:480)
                at org.wso2.carbon.identity.application.authentication.framework.handler.step.impl.DefaultStepHandler.handle(DefaultStepHandler.java:179)
                at org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler.handle(DefaultStepBasedSequenceHandler.java:185) er} - 
Error occurred while getting claims for user: [email protected] from userstore. org.wso2.carbon.user.core.UserStoreException: 30007 - UserNotFound: 
User tanoj123 does not exist in: PRIMARY
            at org.wso2.carbon.user.core.common.AbstractUserStoreManager.callSecure(AbstractUserStoreManager.java:205)
            at org.wso2.carbon.user.core.common.AbstractUserStoreManager.getUserClaimValues(AbstractUserStoreManager.java:1758)
            at org.wso2.carbon.identity.openidconnect.DefaultOIDCClaimsCallbackHandler.getUserClaimsInLocalDialect(DefaultOIDCClaimsCallbackHandler.java:466)
            at org.wso2.carbon.identity.openidconnect.DefaultOIDCClaimsCallbackHandler.getUserClaimsInOIDCDialect(DefaultOIDCClaimsCallbackHandler.java:420)
            at org.wso2.carbon.identity.openidconnect.DefaultOIDCClaimsCallbackHandler.retrieveClaimsForLocalUser(DefaultOIDCClaimsCallbackHandler.java:296)
            at org.wso2.carbon.identity.openidconnect.DefaultOIDCClaimsCallbackHandler.getUserClaimsInOIDCDialect(DefaultOIDCClaimsCallbackHandler.java:146)
            at org.wso2.carbon.identity.openidconnect.DefaultOIDCClaimsCallbackHandler.handleCustomClaims(DefaultOIDCClaimsCallbackHandler.java:85)
            at org.wso2.carbon.apimgt.keymgt.token.APIMJWTGenerator.populateCustomClaims_aroundBody4(APIMJWTGenerator.java:166)
            at org.wso2.carbon.apimgt.keymgt.token.APIMJWTGenerator.populateCustomClaims(APIMJWTGenerator.java:156)
            at org.wso2.carbon.apimgt.keymgt.token.APIMJWTGenerator.buildBody_aroundBody2(APIMJWTGenerator.java:95)
            at org.wso2.carbon.apimgt.keymgt.token.APIMJWTGenerator.buildBody(APIMJWTGenerator.java:92)
            at org.wso2.carbon.apimgt.keymgt.token.APIMJWTGenerator.generateJWT_aroundBody0(APIMJWTGenerator.java:69)
            at org.wso2.carbon.apimgt.keymgt.token.APIMJWTGenerator.generateJWT(APIMJWTGenerator.java:60)
            at org.wso2.carbon.apimgt.keymgt.util.APIMTokenIssuerUtil.generateToken_aroundBody4(APIMTokenIssuerUtil.java:210)
            at org.wso2.carbon.apimgt.keymgt.util.APIMTokenIssuerUtil.generateToken(APIMTokenIssuerUtil.java:173)
            at org.wso2.carbon.apimgt.keymgt.issuers.APIMTokenIssuer.accessToken_aroundBody0(APIMTokenIssuer.java:102)
            at org.wso2.carbon.apimgt.keymgt.issuers.APIMTokenIssuer.accessToken(APIMTokenIssuer.java:51)
            at org.wso2.carbon.identity.oauth2.token.handlers.grant.AbstractAuthorizationGrantHandler.getNewAccessToken(AbstractAuthorizationGrantHandler.java:491)
            at org.wso2.carbon.identity.oauth2.token.handlers.grant.AbstractAuthorizationGrantHandler.createNewTokenBean(AbstractAuthorizationGrantHandler.java:390)
            at org.wso2.carbon.identity.oauth2.token.handlers.grant.AbstractAuthorizationGrantHandler.generateNewAccessToken(AbstractAuthorizationGrantHandler.java:344)

Можете ли вы предоставить скриншот ваших конфигураций этапа аутентификации?

sumedhe 23.12.2020 13:40

И если есть какие-либо журналы ошибок, пожалуйста, предоставьте.

sumedhe 23.12.2020 15:17

@sumedhe - я добавил скриншоты. Я не получаю никаких ошибок, но страница электронной почты OTP не загружается и не перенаправляется из приложения Angular.

Prabakaran Thodithot Sembiyan 23.12.2020 16:33

Можете ли вы добавить скриншот раздела сценария адаптивной аутентификации на странице расширенных конфигураций?

Maduranga Siriwardena 26.12.2020 16:12

@MadurangaSiriwardena - я добавил код/скрипты для того же самого вопроса.

Prabakaran Thodithot Sembiyan 26.12.2020 16:57

В соответствии с вашими настройками шаг EmailOTP можно пропустить, если для этого конкретного пользователя в заявке http://wso2.org/claims/identity/emailotp_disabled установлено значение true.

Sajith 26.12.2020 17:55

Если это не так, давайте включим журналы отладки и посмотрим. Откройте файл log4j2.properties. Раскомментируйте две строки, начинающиеся с logger.org-wso2-carbon-identity-application-authentication-f‌​ramework Добавьте следующие две строки logger.org-wso2-carbon-identity-authenticator-emailotp.name=‌​org.wso2.carbon.iden‌​tity.authenticator.e‌​mailotp logger.org-wso2-carbon-identity-authenticator-emailotp.level‌​=DEBUG Добавьте , org-wso2-carbon-identity-application-authentication-framewor‌​k, org-wso2-carbon-identity-authenticator-emailotp в конец строки, начинающейся с loggers =

Sajith 26.12.2020 18:07

Можете ли вы попробовать, установив для EmailOTPEnableByUserClaim значение false?

Maduranga Siriwardena 26.12.2020 19:49

@MadurangaSiriwardena Это не сработало даже после изменения.

Prabakaran Thodithot Sembiyan 29.12.2020 06:13

@Sajith - я внес изменения, но никакие журналы не запускаются для потока электронной почты OTP.

Prabakaran Thodithot Sembiyan 29.12.2020 06:13

@Sajith - Когда я удаляю «Конфигурацию аутентификации пути запроса», он загружает страницу входа в WSO2 для первого шага, а затем перенаправляет на страницу EMail OTP в качестве второго шага. Принимая во внимание, что когда я включаю «Конфигурацию аутентификации пути запроса» с помощью «BasicAuthRequestPathAuthenticator», он не загружает страницу EmailOTP.

Prabakaran Thodithot Sembiyan 30.12.2020 07:05

@MadurangaSiriwardena - Пожалуйста, посмотрите мой предыдущий комментарий.

Prabakaran Thodithot Sembiyan 30.12.2020 07:06

@PrabakaranThodithotSembiyan, я попытался включить BasicAuthRequestPathAuthenticator, но не увидел вашей проблемы. Если я использую log4j2 как pastebin.com/ewEZutgM , я могу найти журналы отладки, как в pastebin.com/neUEyHR8 после отправки имени пользователя и пароля. Вы можете сравнить то же самое в вашей настройке.

Sajith 01.01.2021 17:57

@Sajith - я также включил те же журналы, но с конфигурацией OpenId Connet я не могу получать какие-либо журналы или электронную почту. Я использую IS-Km (не простой IS)

Prabakaran Thodithot Sembiyan 02.01.2021 15:45

@Sajith - мы включили «Обязательный PKCE» и «Разрешить аутентификацию без секрета клиента». Должен ли я отключить это?

Prabakaran Thodithot Sembiyan 04.01.2021 07:19

Нет, это не должно влиять на это. Поскольку у вас он отлично работает с отключенным аутентификатором пути запроса, с ним должна быть связь. Тем не менее, вы должны получить достаточно журналов отладки, используя log4j2 как pastebin.com/ewEZutgM для IS-KM 5.10.0, а также для определения причины.

Sajith 04.01.2021 21:49

Кстати, вы используете страницу входа wso2 (конечная точка аутентификации) или страницу входа в свой Angular UI?

Sajith 04.01.2021 21:50

Я использую страницу входа в Angular UI. Я не получаю никаких журналов для шагов OTP по электронной почте, даже если журналы отладки включены. Когда я удаляю аутентификацию пути запроса, я получаю журналы отладки. @Саджит

Prabakaran Thodithot Sembiyan 05.01.2021 07:13

Мы включаем журналы отладки, чтобы отслеживать проблему, а не исправлять ее :)

Sajith 05.01.2021 10:52

Какой запрос/конечную точку вы используете для передачи имени пользователя и пароля в WSO2 IS?

Sajith 05.01.2021 10:52

Мы передаем запрос на конечную точку /oauth2/authorize. Добавлен рассматриваемый образец. @Саджит

Prabakaran Thodithot Sembiyan 05.01.2021 11:16

К вашему сведению, My IS работает на 5004 вместо 9443.

Prabakaran Thodithot Sembiyan 05.01.2021 11:32

@Sajith - я добавил журналы отладки здесь pastebin.com/SEeveDHB и здесь pastebin.com/FTKHEPWD

Prabakaran Thodithot Sembiyan 05.01.2021 12:52

Из журналов я вижу, что «пошаговая аутентификация» не срабатывает, когда я использую аутентификацию основного пути запроса. @саджит

Prabakaran Thodithot Sembiyan 05.01.2021 13:03

Понял, спасибо. пожалуйста, проверьте ответ.

Sajith 05.01.2021 18:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
25
570
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В общих журналах можно наблюдать следующую строку.

BasicAuthRequestPathAuthenticator can handle the request

Это означает, что canHandle() метод BasicAuthRequestPathAuthenticator вернул true, поскольку sectoken параметр запроса определен. Затем выполняется аутентификация пути запроса.

BasicAuth RequestPathAuthentication не поддерживает MFA и похож на предоставление пароля. Пользователь проходит аутентификацию, просто подтверждая переданные учетные данные.

Если ваша цель — иметь страницу входа в клиентское приложение (Angular SPA), вы можете передать имя пользователя и пароль как два разных параметра (POST OR GET; POST рекомендуется, поскольку пароль не будет передаваться в URL-адресе) в oauth2/authorize запросить и войти в базовый аутентификатор по умолчанию вместо RequestPathAuthenticator. Тогда MFA будет работать как положено.

Спасибо @Sajith, я использовал тот же вариант, который вы предложили, и он отлично работает.

Prabakaran Thodithot Sembiyan 06.01.2021 08:19

Привет @Sajith, Этот сценарий электронной почты OTP отлично работает для пользователей домена carbon.super, но не работает для пользователей домена-арендатора. После предоставления OTP это приводит к ошибке, о которой я упоминал в вопросе, в разделе «Ошибка домена арендатора». Не могли бы вы сообщить мне, что здесь делать.

Prabakaran Thodithot Sembiyan 01.02.2021 12:48

IS не может вернуть запрошенные претензии пользователю

Prabakaran Thodithot Sembiyan 01.02.2021 12:55

Чтобы добавить больше, страница emailotp.jsp загружается с tenantDomain как carbon.super, а при отправке otp также загружается как carbon.super вместо фактического домена клиента. Как он может взять доменное имя с первого шага аутентификации?

Prabakaran Thodithot Sembiyan 01.02.2021 15:33

Аутентификатор одноразового пароля электронной почты не использует параметр запроса tenantDomain для выбора арендатора пользователя. Вместо этого он получает его, используя информацию, хранящуюся в контексте предыдущего шага. Какая аутентификация выполняется на 1-м шаге?

farasath 01.02.2021 17:27

Мы используем «базовый» в качестве локального аутентификатора на 1-м шаге. Но, согласно журналам, я вижу, что пользователь домена арендатора рассматривается как пользователь домена carbon.super (как в предоставленных журналах).

Prabakaran Thodithot Sembiyan 01.02.2021 18:43

Что произойдет, если вы добавите домен клиента в конец имени пользователя?

Sajith 01.02.2021 19:16

Я уже отправляю имя пользователя как username@tenantdomain

Prabakaran Thodithot Sembiyan 01.02.2021 20:17

Другие вопросы по теме