使用Azure AD与Postman时Django API认证返回微软登录页问题
问题排查与解决方案
以下是针对你的API请求返回微软登录页面问题的具体排查步骤:
1. 检查DRF认证类配置
确保你的Django REST Framework配置中包含ADFS的Token认证类,因为网页登录依赖Session认证,但API需要Token认证:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'django_auth_adfs.rest_framework.AdfsAccessTokenAuthentication', ], # 其他DRF配置... }
2. 验证Access Token有效性
用jwt.io解析你的Access Token,重点检查三个字段:
aud(受众):必须与django_auth_adfs配置中的AUDIENCE完全一致,也就是你在Azure AD「Expose an API」中设置的Application ID URIiss(签发者):格式应为https://sts.windows.net/<你的租户ID>/,需匹配配置里的ISSUER值scp(权限范围):必须包含你为API配置的自定义范围(比如api://<客户端ID>/access_as_user),确保Token拥有访问API的权限
如果aud字段错误,说明你在Postman生成Token时,「资源」参数填成了Azure AD Graph或Microsoft Graph的地址,需改成你自己暴露的API的Application ID URI。
3. 核对django_auth_adfs核心配置
确保配置中API相关参数正确:
AUTH_ADFS = { "CLIENT_ID": "<你的API应用客户端ID>", "CLIENT_SECRET": "<你的API应用客户端密钥>", "AUDIENCE": "api://<你的API应用ID URI>", # 与Token的aud一致 "ISSUER": "https://sts.windows.net/<你的租户ID>/", "PERMISSION_CLAIM": "scp", # 对应Token中的scp字段,用角色则填"roles" "LOGIN_EXEMPT_URLS": [], # 确保API路径不在豁免列表中 # 其他配置... }
4. 确认API权限授权状态
- 若你配置的是委托权限:个人用户生成Token时,只要用户已同意该权限即可;若权限需要管理员同意,需先让Azure AD管理员在应用的「API权限」页面完成授权。
- 若你配置的是应用权限:必须由管理员完成授权才能生效,检查权限状态是否为「已授予」。
5. 检查Postman请求头
- 确保Authorization头格式正确:
Bearer <你的Access Token>(注意Bearer后有一个空格) - 可尝试禁用Postman的Cookie功能,避免Session认证干扰Token认证流程
6. 验证Django中间件顺序
确保ADFS中间件位置正确,在Session和Authentication中间件之后:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django_auth_adfs.middleware.AdfsAuthMiddleware', # 需在此位置 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
7. 查看Django调试日志
开启DEBUG模式并配置日志,捕获认证失败的具体原因:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': {'class': 'logging.StreamHandler'}, }, 'loggers': { 'django_auth_adfs': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': True, }, }, }
运行Django后查看控制台输出,可定位Token验证失败的具体问题(如签名无效、Token过期等)。
内容的提问来源于stack exchange,提问作者Arad Soutehkeshan
相关产品推荐
相关产品推荐

