使用 MSAL.js 的提示行为

MSAL.js 允许将提示值作为其登录或令牌请求方法的一部分传递。 根据你的应用程序方案,可以通过在请求对象中设置提示参数来自定义 Microsoft Entra 的请求提示行为:

import { PublicClientApplication } from "@azure/msal-browser";

const pca = new PublicClientApplication({
    auth: {
        clientId: "YOUR_CLIENT_ID"
    }
});

const loginRequest = {
    scopes: ["https://microsoftgraph.chinacloudapi.cn/user.read"],
    prompt: 'select_account',
}

pca.loginPopup(loginRequest)
    .then(response => {
        // do something with the response
    })
    .catch(error => {
        // handle errors
    });

支持的提示值

使用 Microsoft 标识平台进行身份验证时,可以使用以下提示值:

参数 行为
login 强制用户在该请求上输入其凭据,从而使单一登录无效。
none 确保不向用户显示任何交互式提示。 如果请求无法通过单一登录以无提示方式完成,则 Microsoft 标识平台将返回 login_required 或 interaction_required 错误。
consent 在用户登录后触发 OAuth 同意对话框,要求用户向应用授予权限。
select_account 中断单一登录,提供帐户选择体验,列出会话中的所有帐户,或者提供选择一起使用其他帐户的选项。
create 触发注册对话框,允许外部用户创建帐户。

针对任何不受支持的提示值,MSAL.js 将引发 invalid_prompt 错误:

invalid_prompt_value: Supported prompt values are 'login', 'select_account', 'consent', 'create' and 'none'. Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest Given value: my_custom_prompt

默认提示值

下面显示了 MSAL.js 使用的默认提示值:

MSAL.js 方法 默认提示 允许的提示
loginPopup 空值 任意
loginRedirect 空值 Any
ssoSilent none 空值(已忽略)
acquireTokenPopup 空值 任意
acquireTokenRedirect 空值 Any
acquireTokenSilent none 空值(已忽略)

注意

请注意,提示是协议级参数,并向标识提供者发出所需身份验证行为的信号。 它不会影响 MSAL.js 行为,并且 MSAL.js 无法控制服务最终如何处理请求。 在大多数情况下,Microsoft Entra ID 将尝试遵循请求。 如果无法做到这一点,则可能会返回错误响应,或完全忽略给定的提示值。

包含 prompt=none 的交互式请求

通常,当需要发出无提示请求时,使用无提示 MSAL.js 方法(ssoSilentacquireTokenSilent),并使用交互式方法(loginPopuploginRedirectacquireTokenPopupacquireTokenRedirect)处理任何 login_required 或 interaction_required 错误。

但是,在某些情况下,可将提示值 none 与交互式 MSAL.js 方法配合使用以实现无提示身份验证。 例如,由于某些浏览器中的第三方 Cookie 限制,尽管与 Microsoft Entra ID 有活动用户会话,ssoSilent 请求也会失败。 作为补救措施,可以将提示值 none 传递给交互式请求(例如 loginPopup)。 然后,MSAL.js 会打开 Microsoft Entra ID 的弹出窗口,Microsoft Entra ID 会利用现有会话 Cookie 来遵循提示值。 在这种情况下,用户会看到一个简单的弹出窗口,但不会提示用户输入凭据。

后续步骤