使用angular-oauth2-oidc登出时因id_token_hint过长触发AADSTS90015错误
Angular + angular-oauth2-oidc 对接Azure AD登出时id_token_hint过长问题解决
1. 是否可以在登出时禁止传递id_token_hint?
可以。angular-oauth2-oidc库默认会自动携带id_token_hint参数,但你可以在调用登出方法时显式覆盖这个参数,阻止其被传递:
// 调用logout时传入配置,将idTokenHint设为null,禁止传递该参数 this.oauthService.logout({ idTokenHint: null });
注意:去掉id_token_hint后,Azure AD依然会处理登出请求,但可能会要求用户手动确认登出操作。同时需要确保你的应用的post_logout_redirect_uri已在Azure AD应用注册中正确配置并被允许,否则可能无法正常跳转回应用。
2. id_token因组声明过大时的登出最佳实践
针对组声明导致id_token体积过大的问题,推荐以下几种处理方案:
优化Azure AD组声明返回规则
在Azure AD应用注册的「令牌配置」中调整组声明的返回逻辑:
- 仅返回应用实际需要的组:添加筛选条件,按组名称、ID或类型(如仅安全组)过滤,避免返回用户所有所属组。
- 使用组ID替代组名称:组ID的字符串长度远短于组名称,能有效压缩令牌体积。
- 启用组筛选功能:配置Azure AD仅同步与应用业务相关的组。
按需获取组信息,不嵌入id_token
不要将所有组声明打包进id_token,而是在用户登录后通过Microsoft Graph API按需获取:
- 使用用户的access token调用
GET /me/memberOf接口获取组数据。 - 将获取到的组信息缓存到前端或后端,避免重复请求。
这种方式从根源上避免了组声明占用id_token空间,彻底解决令牌过大问题。
改用POST方式发起登出请求
默认情况下angular-oauth2-oidc使用GET请求发起登出,参数拼接在URL中导致过长。可以改为POST请求,将参数放入请求体:
- 手动构造登出表单,提交到Azure AD的logout端点(格式为
https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/logout)。 - 表单中仅携带
client_id、post_logout_redirect_uri等必要参数,无需传递id_token_hint。
清理不必要的令牌声明
检查Azure AD应用注册的令牌配置,移除所有应用不需要的额外声明,进一步压缩id_token体积。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

