使用 MSAL.js 的提示行为
MSAL.js 允许将提示值作为其登录或令牌请求方法的一部分传递。 根据你的应用程序方案,可以通过在请求对象中设置提示参数来自定义 Microsoft Entra 的请求提示行为:
import { PublicClientApplication } from "@azure/msal-browser";
const pca = new PublicClientApplication({
auth: {
clientId: "YOUR_CLIENT_ID"
}
});
const loginRequest = {
scopes: ["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 方法(ssoSilent
、acquireTokenSilent
),并使用交互式方法(loginPopup
、loginRedirect
、acquireTokenPopup
、acquireTokenRedirect
)处理任何 login_required 或 interaction_required 错误。
但是,在某些情况下,可将提示值 none
与交互式 MSAL.js 方法配合使用以实现无提示身份验证。 例如,由于某些浏览器中的第三方 Cookie 限制,尽管与 Microsoft Entra ID 有活动用户会话,ssoSilent
请求也会失败。 作为补救措施,可以将提示值 none
传递给交互式请求(例如 loginPopup
)。 然后,MSAL.js 会打开 Microsoft Entra ID 的弹出窗口,Microsoft Entra ID 会利用现有会话 Cookie 来遵循提示值。 在这种情况下,用户会看到一个简单的弹出窗口,但不会提示用户输入凭据。