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

如何从Python-Django项目生成元数据,实现与C#/.NET网站的SAML SSO集成?

生成Django SAML SP元数据对接.NET IdP的解决方案

方法一:用python3-saml快速生成独立元数据

无需先集成到Django,先生成符合SAML标准的元数据XML,后续再对接认证逻辑:

  1. 安装依赖

    pip install python3-saml
    
  2. 创建配置文件(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中配置路由。

  3. 编写生成元数据的脚本
    新建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)
    
  4. 执行脚本生成元数据

    python generate_metadata.py
    

    执行完成后,当前目录会生成sp_metadata.xml,直接将这个文件提供给.NET IdP管理员即可。

方法二:用djangosaml2在Django项目中暴露元数据接口

如果需要直接在Django项目中提供可访问的元数据地址,按以下步骤操作:

  1. 安装依赖

    pip install djangosaml2
    

    同时确保系统安装了xmlsec1工具,Ubuntu系统可执行sudo apt install xmlsec1。

  2. 配置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',  # 保留原有账号密码认证
    ]
    
  3. 配置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'),
    ]
    
  4. 获取元数据
    启动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:43:09