Я включил поставщика удостоверений 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§oken=<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 - я добавил скриншоты. Я не получаю никаких ошибок, но страница электронной почты OTP не загружается и не перенаправляется из приложения Angular.
Можете ли вы добавить скриншот раздела сценария адаптивной аутентификации на странице расширенных конфигураций?
@MadurangaSiriwardena - я добавил код/скрипты для того же самого вопроса.
В соответствии с вашими настройками шаг EmailOTP можно пропустить, если для этого конкретного пользователя в заявке http://wso2.org/claims/identity/emailotp_disabled
установлено значение true
.
Если это не так, давайте включим журналы отладки и посмотрим. Откройте файл log4j2.properties. Раскомментируйте две строки, начинающиеся с logger.org-wso2-carbon-identity-application-authentication-framework
Добавьте следующие две строки logger.org-wso2-carbon-identity-authenticator-emailotp.name=org.wso2.carbon.identity.authenticator.emailotp logger.org-wso2-carbon-identity-authenticator-emailotp.level=DEBUG
Добавьте , org-wso2-carbon-identity-application-authentication-framework, org-wso2-carbon-identity-authenticator-emailotp
в конец строки, начинающейся с loggers =
Можете ли вы попробовать, установив для EmailOTPEnableByUserClaim
значение false?
@MadurangaSiriwardena Это не сработало даже после изменения.
@Sajith - я внес изменения, но никакие журналы не запускаются для потока электронной почты OTP.
@Sajith - Когда я удаляю «Конфигурацию аутентификации пути запроса», он загружает страницу входа в WSO2 для первого шага, а затем перенаправляет на страницу EMail OTP в качестве второго шага. Принимая во внимание, что когда я включаю «Конфигурацию аутентификации пути запроса» с помощью «BasicAuthRequestPathAuthenticator», он не загружает страницу EmailOTP.
@MadurangaSiriwardena - Пожалуйста, посмотрите мой предыдущий комментарий.
@PrabakaranThodithotSembiyan, я попытался включить BasicAuthRequestPathAuthenticator, но не увидел вашей проблемы. Если я использую log4j2 как pastebin.com/ewEZutgM , я могу найти журналы отладки, как в pastebin.com/neUEyHR8 после отправки имени пользователя и пароля. Вы можете сравнить то же самое в вашей настройке.
@Sajith - я также включил те же журналы, но с конфигурацией OpenId Connet я не могу получать какие-либо журналы или электронную почту. Я использую IS-Km (не простой IS)
@Sajith - мы включили «Обязательный PKCE» и «Разрешить аутентификацию без секрета клиента». Должен ли я отключить это?
Нет, это не должно влиять на это. Поскольку у вас он отлично работает с отключенным аутентификатором пути запроса, с ним должна быть связь. Тем не менее, вы должны получить достаточно журналов отладки, используя log4j2 как pastebin.com/ewEZutgM для IS-KM 5.10.0, а также для определения причины.
Кстати, вы используете страницу входа wso2 (конечная точка аутентификации) или страницу входа в свой Angular UI?
Я использую страницу входа в Angular UI. Я не получаю никаких журналов для шагов OTP по электронной почте, даже если журналы отладки включены. Когда я удаляю аутентификацию пути запроса, я получаю журналы отладки. @Саджит
Мы включаем журналы отладки, чтобы отслеживать проблему, а не исправлять ее :)
Какой запрос/конечную точку вы используете для передачи имени пользователя и пароля в WSO2 IS?
Мы передаем запрос на конечную точку /oauth2/authorize. Добавлен рассматриваемый образец. @Саджит
К вашему сведению, My IS работает на 5004 вместо 9443.
@Sajith - я добавил журналы отладки здесь pastebin.com/SEeveDHB и здесь pastebin.com/FTKHEPWD
Из журналов я вижу, что «пошаговая аутентификация» не срабатывает, когда я использую аутентификацию основного пути запроса. @саджит
Понял, спасибо. пожалуйста, проверьте ответ.
В общих журналах можно наблюдать следующую строку.
BasicAuthRequestPathAuthenticator can handle the request
Это означает, что canHandle()
метод BasicAuthRequestPathAuthenticator вернул true
, поскольку sectoken
параметр запроса определен. Затем выполняется аутентификация пути запроса.
BasicAuth RequestPathAuthentication не поддерживает MFA и похож на предоставление пароля. Пользователь проходит аутентификацию, просто подтверждая переданные учетные данные.
Если ваша цель — иметь страницу входа в клиентское приложение (Angular SPA), вы можете передать имя пользователя и пароль как два разных параметра (POST OR GET; POST рекомендуется, поскольку пароль не будет передаваться в URL-адресе) в oauth2/authorize
запросить и войти в базовый аутентификатор по умолчанию вместо RequestPathAuthenticator. Тогда MFA будет работать как положено.
Спасибо @Sajith, я использовал тот же вариант, который вы предложили, и он отлично работает.
Привет @Sajith, Этот сценарий электронной почты OTP отлично работает для пользователей домена carbon.super, но не работает для пользователей домена-арендатора. После предоставления OTP это приводит к ошибке, о которой я упоминал в вопросе, в разделе «Ошибка домена арендатора». Не могли бы вы сообщить мне, что здесь делать.
IS не может вернуть запрошенные претензии пользователю
Чтобы добавить больше, страница emailotp.jsp загружается с tenantDomain как carbon.super, а при отправке otp также загружается как carbon.super вместо фактического домена клиента. Как он может взять доменное имя с первого шага аутентификации?
Аутентификатор одноразового пароля электронной почты не использует параметр запроса tenantDomain для выбора арендатора пользователя. Вместо этого он получает его, используя информацию, хранящуюся в контексте предыдущего шага. Какая аутентификация выполняется на 1-м шаге?
Мы используем «базовый» в качестве локального аутентификатора на 1-м шаге. Но, согласно журналам, я вижу, что пользователь домена арендатора рассматривается как пользователь домена carbon.super (как в предоставленных журналах).
Что произойдет, если вы добавите домен клиента в конец имени пользователя?
Я уже отправляю имя пользователя как username@tenantdomain
Можете ли вы предоставить скриншот ваших конфигураций этапа аутентификации?