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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:24:30