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

Django中间件中获取AD的_id_token_claims报错,请求解决方法

解决Django中间件中获取AD ID Token Claims的问题

错误原因

你遇到的报错是因为自定义中间件的执行顺序在MsIdentityWebMiddleware之前,此时request还未被微软身份认证中间件处理,没有附加identity_context_data属性;同时直接实例化IdentityWebPython并没有走完整的认证初始化流程,无法正确获取claims。

解决方案

1. 调整中间件执行顺序

在settings.py的MIDDLEWARE列表中,将你的自定义中间件放在MsIdentityWebMiddleware之后,确保身份认证逻辑先执行:

MIDDLEWARE = [
    # 其他中间件...
    'ms_identity_web.django.middleware.MsIdentityWebMiddleware',
    'your_app.middleware.YourCustomMiddleware',  # 你的自定义中间件放在这里
]

2. 正确获取Claims

不需要重新实例化IdentityWebPython,直接复用认证中间件附加到request上的实例,同时判断属性是否存在(避免未认证请求报错):

class YourCustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 处理请求前逻辑
        if hasattr(request, 'identity_context_data'):
            claims = request.identity_context_data._id_token_claims
            print(claims)  # 输出AD ID Token详情
        
        response = self.get_response(request)
        
        # 处理请求后逻辑
        return response

3. 若需手动初始化IdentityWebPython(不推荐)

如果一定要手动创建实例,需要确保传入的request已完成认证,并且正确加载配置:

from django.conf import settings
from ms_identity_web import IdentityWebPython

# 在中间件的__call__方法中,确保已过认证中间件后执行
identity_web = IdentityWebPython(request, settings.MS_IDENTITY_WEB_CONFIG)
if identity_web.is_authenticated:
    claims = identity_web._id_token_claims
    print(claims)

注意事项

  • 未认证的请求(如匿名访问)不会有identity_context_data属性,必须先做存在性判断,避免抛出属性不存在的异常。
  • 优先使用request.identity_context_data,这是微软身份认证中间件预先初始化好的实例,更稳定且符合框架设计逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:35:06