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

