Django REST Framework使用django-auth-adfs认证配置问题排查
django-auth-adfs 对接 DRF 与 Azure AD 配置排查及修正方案
配置错误根因
- 接口权限规则过松:当前配置的
IsAuthenticatedOrReadOnly权限类默认放行所有未认证的GET、HEAD、OPTIONS请求,不会触发认证校验,这是未携带有效Token访问API仍能拿到正常响应的直接原因。 - 冗余认证后端触发无效日志:
AdfsAuthCodeBackend仅用于网页端授权码跳转SSO场景,未配置对应SSO路由时,访问/admin站点会触发Django遍历所有认证后端执行校验,该后端拿不到授权码就会输出对应debug日志;同时配置中缺少Django默认的ModelBackend,会导致本地超级用户账号无法正常登录admin。 - 无效配置项残留:
RELYING_PARTY_ID是本地部署AD FS服务专用参数,对接Azure AD时不需要配置,残留该参数可能触发配置校验逻辑异常。 - Azure AD端点未显式声明:部分低版本django-auth-adfs无法仅通过
TENANT_ID自动拼接Azure AD v2.0的认证端点,会导致元数据拉取失败、Token校验逻辑异常。
修正后的完整配置
settings.py核心配置如下:
# 认证后端按需加载,移除无用后端避免无效触发 AUTHENTICATION_BACKENDS = ( 'django_auth_adfs.backend.AdfsAccessTokenBackend', # API Access Token 认证专用后端 'django.contrib.auth.backends.ModelBackend', # 保留默认后端,兼容本地超级用户登录admin # 仅当需要网页端SSO登录时,再添加 'django_auth_adfs.backend.AdfsAuthCodeBackend' ) AUTH_ADFS = { 'AUDIENCE': client_id, 'CLIENT_ID': client_id, 'CLIENT_SECRET': client_secret, 'TENANT_ID': tenant_id, # 显式声明Azure AD v2.0端点,避免库自动拉取元数据失败 'AUTHORIZE_URL': f'https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize', 'ACCESS_TOKEN_URL': f'https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token', 'JWKS_URI': f'https://login.microsoftonline.com/{tenant_id}/discovery/v2.0/keys', 'ISSUER': f'https://login.microsoftonline.com/{tenant_id}/v2.0', # 用户字段映射保持原有逻辑即可 'CLAIM_MAPPING': { 'first_name': 'given_name', 'last_name': 'family_name', 'email': 'upn' }, 'GROUPS_CLAIM': 'roles', 'MIRROR_GROUPS': True, 'USERNAME_CLAIM': 'upn', 'LOGIN_REDIRECT_URL': '/admin/', # SSO登录成功后跳转地址 # 移除仅本地AD FS需要的RELYING_PARTY_ID配置 } REST_FRAMEWORK = { # 改为严格认证模式,所有请求必须携带有效凭证 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'django_auth_adfs.rest_framework.AdfsAccessTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', # 保留供admin、可浏览API使用 ), }
配套校验规则
- 路由配置:如果需要保留网页端(含admin)的Azure AD SSO能力,必须在根
urls.py中添加django-auth-adfs内置路由,否则授权码流程无法闭环:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('oauth2/', include('django_auth_adfs.urls')), path('admin/', admin.site.urls), # 其余业务路由保持原有配置 ]
如果不需要网页端SSO,直接从AUTHENTICATION_BACKENDS中移除AdfsAuthCodeBackend即可,不会再输出对应的debug日志。
- Azure侧配置校验:确认Azure应用注册的令牌配置中已经启用
upn、given_name、family_name、roles声明,Access Token版本设置为v2,同时为客户端配置了对应API权限,否则会出现用户信息映射失败、权限组识别异常问题。 - 日志优化:如果不需要查看django-auth-adfs的调试信息,可在日志配置中将对应logger的级别调整为INFO及以上,屏蔽无意义的debug输出。
内容的提问来源于stack exchange,提问作者jebaseelan ravi
相关产品推荐
相关产品推荐

