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
相关产品推荐
相关产品推荐

