MSAL acquTokenSilent, за которым следует acquTokenPopup, выдает во всплывающем окне неверный запрос
Мы используем MSAL.js для аутентификации пользователей в нашем экземпляре Azure AD B2C. Пользователи могут использовать локальную учетную запись или войти, используя свои учетные данные из другого экземпляра Azure Active Directory.
Войдя в систему, наш SPA получает токен доступа с использованием acquTokenSilent, с откатом на acquTokenPopup.
Мы заметили, что по истечении времени срока действия acquTokenSilent токен может быть получен в фоновом режиме, а локальное хранилище приложения обновляется токеном. Тем не менее, в приложении мы перешли к вызову acquTokenPopup. После того, как пользователь вводит свои учетные данные в acquTokenPopup, во всплывающем окне отображается "Плохой запрос". Пользователь может закрыть всплывающее окно, и если они обновят приложение, они теперь войдут в систему.
Этот опыт не является хорошим опытом для наших пользователей.
Просто интересно, является ли это известной проблемой или ожидаемым поведением?
Вот соответствующая выдержка из нашего кода. Мы обертываем UserAgentApplication в объект MsalAuthenticationManager.
function getMsalAuthenticationManager(authority: IMSALAuthorityConfig): IMsalAuthenticationManager {
return new MsalAuthenticationManager(
appConfig.msal.clientId,
authority.signUpOrSignInAuthority,
authority.passwordResetAuthority,
{
loadFrameTimeout: 15000,
endPoints: endPointsMap,
cacheLocation: appConfig.msal.cacheLocation // localStorage
}
);
}
// MsalAuthenticationManager constructor
constructor(
private applicationId: string,
authority?: string,
authorityForPasswordReset?: string,
msalOptions?: IMsalOptions
) {
var onTokenReceived = authorityForPasswordReset
? (errorDesc: string, token: string, error: string, tokenType: string) => {
// When the user clicks on the forgot password link, the following error is returned to this app.
// In this case we need to re-instantiate the UserAgentApplication object with the Password Reset policy.
if (errorDesc && errorDesc.indexOf("AADB2C90118") > -1) {
this._msal = new UserAgentApplication(
applicationId,
authorityForPasswordReset,
onTokenReceived,
msalOptions
);
this.signIn();
}
}
: (errorDesc: string, token: string, error: string, tokenType: string) => {};
this._msal = new UserAgentApplication(applicationId, authority, onTokenReceived, msalOptions);
this.acquireToken = this.acquireToken.bind(this);
this.signIn = this.signIn.bind(this);
this.signOut = this.signOut.bind(this);
this.getResourceForEndpoint = this.getResourceForEndpoint.bind(this); // Gets the scope for a particular endpoint
this.acquireToken = this.acquireToken.bind(this);
}
public acquireToken(scopes: string[]): Promise<string> {
return new Promise((resolve, reject) => {
this._msal
.acquireTokenSilent(scopes)
.then((accessToken: string) => resolve(accessToken))
.catch((acquireTokenSilentError: string) => {
this._msal
.acquireTokenPopup(scopes)
.then((accessToken: string) => resolve(accessToken))
.catch((acquireTokenPopupError: string) => reject(acquireTokenPopupError));
});
});
}
0 ответов
У меня была похожая проблема, причина в том, что токен все еще существует, но срок его действия истек, и, поскольку msal.js не проверяет срок действия токена, вы будете зарегистрированы как зарегистрированные, но ваш токен на самом деле недействителен, и ваши запросы http с однонаправленным каналом завершатся с ошибкой, так как несанкционированным. Вы должны зарегистрировать ошибку acqutokenSilent и найти ошибку "AADB2C90077". Если срок действия токена истек, вызовите logout().