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

将Azure Active Directory作为Django自定义认证后端的实现咨询

实现Azure AD作为Django自定义认证后端步骤

1. 编写自定义认证后端

在你的Django项目中创建backends.py文件,继承Django原生的BaseBackend,结合已集成的MSAL库完成AD用户验证与本地用户同步:

from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.models import User
from msal import ConfidentialClientApplication
from django.conf import settings
import requests

class AzureADBackend(BaseBackend):
    def authenticate(self, request, **kwargs):
        # 从请求会话或参数中获取MSAL授权流程结果
        msal_app = ConfidentialClientApplication(
            settings.MICROSOFT_CLIENT_ID,
            authority=settings.MICROSOFT_AUTHORITY,
            client_credential=settings.MICROSOFT_CLIENT_SECRET
        )
        
        # 静默获取令牌(优先)或通过授权码流程获取
        result = msal_app.acquire_token_silent(settings.MICROSOFT_SCOPE, account=None)
        if not result:
            result = msal_app.acquire_token_by_auth_code_flow(request.session.get('flow'), request.GET)
        
        if 'access_token' in result:
            # 调用Graph API拉取AD用户详情
            graph_data = requests.get(
                'https://graph.microsoft.com/v1.0/me',
                headers={'Authorization': f'Bearer {result["access_token"]}'}
            ).json()
            
            # 同步或创建Django本地用户,默认赋予后台访问权限
            user, created = User.objects.get_or_create(
                username=graph_data['userPrincipalName'],
                defaults={
                    'email': graph_data.get('mail') or graph_data['userPrincipalName'],
                    'first_name': graph_data.get('givenName', ''),
                    'last_name': graph_data.get('surname', ''),
                    'is_staff': True
                }
            )
            return user
        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

2. 配置项目认证设置

修改settings.py,替换默认认证后端,确保MSAL参数与之前集成的配置一致:

# 替换认证后端为自定义的Azure AD后端
AUTHENTICATION_BACKENDS = [
    '你的项目名.backends.AzureADBackend',
    # 如需保留本地用户认证,可保留默认后端,否则删除
    # 'django.contrib.auth.backends.ModelBackend',
]

# MSAL核心配置(沿用之前集成示例中的参数)
MICROSOFT_CLIENT_ID = '你的Azure应用客户端ID'
MICROSOFT_AUTHORITY = 'https://login.microsoftonline.com/你的租户ID'
MICROSOFT_CLIENT_SECRET = '你的Azure应用客户端密钥'
MICROSOFT_SCOPE = ['User.Read']

# 登录重定向配置
LOGIN_URL = '/login'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

3. 调整登录流程与权限控制

修改原有的MSAL登录视图,将认证后的用户接入Django原生认证系统:

from django.contrib.auth import login
from django.shortcuts import redirect
from django.conf import settings

def azure_login(request):
    # 保留原有MSAL授权流程逻辑(如生成授权URL、处理回调)
    # 获取令牌成功后,调用自定义后端完成用户认证
    user = AzureADBackend().authenticate(request)
    if user:
        login(request, user)
        return redirect(settings.LOGIN_REDIRECT_URL)
    return redirect('login')

将所有页面的@ms_identity_web.login_required替换为Django原生的@login_required装饰器,统一使用Django认证体系控制访问:

from django.contrib.auth.decorators import login_required

@login_required
def dashboard(request):
    return render(request, 'dashboard.html')

4. 适配Admin后台权限

如果需要基于AD组分配Django权限,可在authenticate方法中扩展组同步逻辑:

# 在获取graph_data后添加以下代码
from django.contrib.auth.models import Group

# 拉取用户所属AD组信息
groups_data = requests.get(
    'https://graph.microsoft.com/v1.0/me/memberOf',
    headers={'Authorization': f'Bearer {result["access_token"]}'}
).json()

# 同步AD组到Django Group模型
for group in groups_data.get('value', []):
    django_group, _ = Group.objects.get_or_create(name=group['displayName'])
    user.groups.add(django_group)

关键注意事项

  • 确保Azure应用已配置足够的Graph API权限(如User.Read、Directory.Read.All),否则无法拉取完整用户信息。
  • 可添加定时任务,定期同步AD用户的信息(如姓名、邮箱)到Django本地用户。
  • 测试注销流程,确保Django会话与AD登录状态同步失效。

内容的提问来源于stack exchange,提问作者duxk.gh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:52:56