如何从Python-Django项目生成元数据,实现与C#/.NET网站的SAML SSO集成?
生成Django SAML SP元数据对接.NET IdP的解决方案
方法一:用python3-saml快速生成独立元数据
无需先集成到Django,先生成符合SAML标准的元数据XML,后续再对接认证逻辑:
安装依赖
pip install python3-saml创建配置文件(settings.json)
替换以下参数为你的Django项目和.NET IdP的实际信息:{ "sp": { "entityId": "https://your-django-domain.com/saml/metadata/", "assertionConsumerService": { "url": "https://your-django-domain.com/saml/acs/", "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" }, "singleLogoutService": { "url": "https://your-django-domain.com/saml/sls/", "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" }, "NameIDFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", "x509cert": "", "privateKey": "" }, "idp": { "entityId": "https://your-net-idp-domain.com/saml/idp/metadata", "singleSignOnService": { "url": "https://your-net-idp-domain.com/saml/idp/sso", "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" }, "singleLogoutService": { "url": "https://your-net-idp-domain.com/saml/idp/slo", "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" }, "x509cert": "-----BEGIN CERTIFICATE-----\n[.NET IdP提供的公钥内容]\n-----END CERTIFICATE-----" } }注:
entityId是你的SP唯一标识,assertionConsumerService.url是Django接收IdP断言的回调地址,需后续在Django中配置路由。编写生成元数据的脚本
新建generate_metadata.py文件:import json from onelogin.saml2.settings import OneLogin_Saml2_Settings from onelogin.saml2.metadata import OneLogin_Saml2_Metadata # 加载配置 with open('settings.json', 'r') as f: settings = json.load(f) saml_settings = OneLogin_Saml2_Settings(settings) metadata = OneLogin_Saml2_Metadata.generate(saml_settings) # 保存元数据到本地文件 with open('sp_metadata.xml', 'w') as f: f.write(metadata)执行脚本生成元数据
python generate_metadata.py执行完成后,当前目录会生成
sp_metadata.xml,直接将这个文件提供给.NET IdP管理员即可。
方法二:用djangosaml2在Django项目中暴露元数据接口
如果需要直接在Django项目中提供可访问的元数据地址,按以下步骤操作:
安装依赖
pip install djangosaml2同时确保系统安装了
xmlsec1工具,Ubuntu系统可执行sudo apt install xmlsec1。配置Django settings.py
添加应用到INSTALLED_APPS:INSTALLED_APPS = [ # ... 其他已有应用 'djangosaml2', ]添加SAML核心配置到文件末尾:
SAML_CONFIG = { 'xmlsec_binary': '/usr/bin/xmlsec1', 'entityid': 'https://your-django-domain.com/saml/metadata/', 'service': { 'sp': { 'name': 'Django SAML Service Provider', 'endpoints': { 'assertion_consumer_service': [ ('https://your-django-domain.com/saml/acs/', 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'), ], 'single_logout_service': [ ('https://your-django-domain.com/saml/sls/', 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'), ], }, 'allow_unsolicited': True, 'authn_requests_signed': False, 'want_assertions_signed': True, }, }, 'metadata': { 'remote': [ { 'url': 'https://your-net-idp-domain.com/saml/idp/metadata', }, ], }, # 可选:生成自己的密钥对用于签名 'key_file': '/path/to/your/private.key', 'cert_file': '/path/to/your/public.cert', 'contact_person': [ { 'given_name': 'Tech Admin', 'email_address': 'admin@your-domain.com', 'contact_type': 'technical', }, ], 'organization': { 'name': [('Your Company', 'en')], 'url': [('https://your-domain.com', 'en')], }, } # 配置认证后端 AUTHENTICATION_BACKENDS = [ 'djangosaml2.backends.Saml2Backend', 'django.contrib.auth.backends.ModelBackend', # 保留原有账号密码认证 ]配置urls.py路由
添加SAML相关路由:from django.urls import path import djangosaml2.views urlpatterns = [ # ... 其他已有路由 path('saml/acs/', djangosaml2.views.assertion_consumer_service, name='saml_acs'), path('saml/sls/', djangosaml2.views.logout_service, name='saml_sls'), path('saml/metadata/', djangosaml2.views.metadata, name='saml_metadata'), path('saml/login/', djangosaml2.views.login, name='saml_login'), ]获取元数据
启动Django服务后,访问https://your-django-domain.com/saml/metadata/,页面会直接返回SP元数据XML,复制内容发给.NET IdP管理员即可。
关键注意事项
- 确保Django项目使用HTTPS协议,SAML标准通常要求HTTPS环境,否则IdP可能拒绝配置。
- 若需要签名元数据,可通过
openssl req -x509 -newkey rsa:4096 -keyout private.key -out public.cert -days 365 -nodes生成密钥对,替换配置中的对应路径。 - 提前与.NET IdP管理员确认元数据要求,比如NameID格式、是否需要签名的请求/断言等。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

