You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制NextAuth/Azure AD每次调用signIn()都要求用户输入凭证?

解决NextAuth/Azure AD登出后无需凭证即可重新登录的问题

这个问题的核心是Azure AD默认会保留用户的会话Cookie,即使通过NextAuth的signOut()清除了应用内的会话,Azure端的会话依然存在,导致再次调用signIn()时会自动完成认证。要强制每次登录都要求用户输入凭证,可以从两个方面入手:

一、强制登录时要求Azure AD重新验证

NextAuth 4 配置方式

1. 全局强制验证(Provider层面)

修改[...nextauth].js配置,给Azure AD Provider的authorization参数添加prompt: "login",让所有登录请求都强制要求输入凭证:

import NextAuth from "next-auth"
import AzureADProvider from "next-auth/providers/azure-ad"

export default NextAuth({
  providers: [
    AzureADProvider({
      clientId: process.env.AZURE_AD_CLIENT_ID,
      clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
      tenantId: process.env.AZURE_AD_TENANT_ID,
      authorization: {
        params: {
          prompt: "login"
        }
      }
    })
  ],
  // 其他配置项...
})

2. 特定场景强制验证(调用signIn时指定)

如果只需要在部分场景下强制用户重新输入凭证,可以在调用signIn()时传递参数:

signIn('azure-ad', { prompt: 'login' })

NextAuth 5(Auth.js)配置方式

NextAuth 5已更名为Auth.js,配置逻辑一致:

1. 全局强制验证(Provider层面)

修改auth.config.js:

import { NextAuthConfig } from "next-auth"
import AzureAD from "next-auth/providers/azure-ad"

export default {
  providers: [
    AzureAD({
      clientId: process.env.AZURE_AD_CLIENT_ID,
      clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
      tenantId: process.env.AZURE_AD_TENANT_ID,
      authorization: {
        params: {
          prompt: "login"
        }
      }
    })
  ],
  // 其他配置项...
} satisfies NextAuthConfig

2. 特定场景强制验证(调用signIn时指定)

signIn('azure-ad', { prompt: 'login' })

二、登出时同步清除Azure AD会话

仅清除NextAuth的应用会话不够,需要在登出时跳转到Azure AD的登出页面,彻底清除Azure端的会话Cookie:

NextAuth 4 配置

在[...nextauth].js中添加signOut回调:

export default NextAuth({
  // ...其他配置
  callbacks: {
    async signOut({ url }) {
      // 构造Azure AD登出URL,登出后自动跳转回应用
      const azureLogoutUrl = `https://login.microsoftonline.com/${process.env.AZURE_AD_TENANT_ID}/oauth2/v2.0/logout?post_logout_redirect_uri=${encodeURIComponent(url)}`
      return azureLogoutUrl
    }
  }
})

NextAuth 5(Auth.js)配置

在auth.config.js中添加signOut回调:

export default {
  // ...其他配置
  callbacks: {
    async signOut({ url }) {
      const azureLogoutUrl = `https://login.microsoftonline.com/${process.env.AZURE_AD_TENANT_ID}/oauth2/v2.0/logout?post_logout_redirect_uri=${encodeURIComponent(url)}`
      return azureLogoutUrl
    }
  }
} satisfies NextAuthConfig

结合以上两种配置,就能确保每次调用signIn()时,用户必须重新输入Azure AD的凭证才能登录。

内容的提问来源于stack exchange,提问作者Robert Hufsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:59:54