支持私有云部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Dify 架构篇| 多租户下的SSO功能

发布日期:2025-03-29 20:03:40 浏览次数: 1654 作者:真聊技术
推荐语

探索Dify社区版在多租户架构下的SSO功能实现,掌握企业级智能体平台的构建要领。

核心内容:
1. Dify社区版多租户智能体平台基础功能与商业化应用限制
2. SSO在企业级应用中的重要性及其核心流程解析
3. Dify SSO的技术实现细节与配置关键步骤

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家



在多租户架构的支持下,dify社区版已经具备了企业级智能体平台的基础功能。企业或个人用户只需对代码进行简单的定制化开发,即可基于Dify平台构建自己的多租户智能体平台。然而,在商业化应用中,需要特别注意Dify社区版的一些限制,建议提前规划并做出适当的调整。

企业级应用中的SSO(单点登录)

单点登录(SSO)是企业级平台中不可或缺的核心功能之一。通过SSO,企业用户可以在不同应用间实现无缝登录,避免重复认证,提高用户体验和安全性。在此功能的支持下,企业可以将智能体平台扩展到各种场景中,用户只需登录一次,即可访问其权限范围内的所有智能体应用。

不过,在Dify社区版中,SSO功能是默认禁用的,除非你知道如何开启它。

Dify的SSO逻辑设计

Dify的SSO系统基于企业级的功能需求设计,采用集中认证服务来实现用户的单点登录。通过这种方式,用户仅需登录一次即可访问多个关联的应用,极大地简化了认证流程。下面简要介绍Dify SSO的核心流程。

Dify SSO 核心流程

1.用户访问受保护资源

用户尝试访问集成到 Dify SSO 体系的应用(如应用 A),若未登录,应用 A 将用户重定向至 Dify 的中央认证服务(SSO 系统)。

2.身份验证

用户在 SSO 系统的登录页面输入凭据(如账号密码),Dify 验证通过后生成一个加密的 身份凭证(如 JWT 令牌或 Session Cookie)。

3.凭证传递与验证  

 方式一(Cookie):Dify 在用户浏览器设置一个 跨域安全 Cookie,后续访问其他应用时自动携带此 Cookie 完成验证。  

方式二(Token):生成 JWT 令牌并通过 URL 参数或 HTTP Header 传递给应用,应用通过 Dify 的 API 验证令牌有效性。

4.多应用无缝访问

用户访问其他应用(如应用 B)时,应用 B 检测到未登录状态后重定向至 Dify SSO。由于浏览器已存在有效凭证,SSO 直接授权并重定向回应用 B,无需重复登录。

5.单点登出(SLO)

用户登出任意应用时,该应用通知 Dify SSO 清除全局会话,Dify 触发所有关联应用同步注销。

Dify SSO 的技术实现

协议支持:支持 OAuth 2.0、SAML 等标准协议,可集成企业 AD/LDAP 或第三方身份提供商(如 Okta、Azure AD)。

安全性:通过 HTTPS 加密通信,令牌采用签名验证防止篡改,支持短期令牌自动刷新。

企业级功能:在 Dify 企业版中,SSO 结合 RBAC(基于角色的访问控制),实现细粒度权限管理。

配置 Dify SSO 的关键步骤

1.启用 SSO 服务:在 Dify 社区版中配置 SSO 。

2.应用集成:为每个子应用分配唯一标识符,设置回调地址和权限范围。

3.会话管理:定义令牌有效期、单点登出策略及审计日志。

如何在Dify社区版中开启SSO功能

尽管Dify社区版默认不启用SSO功能,但你可以通过以下步骤开启并配置企业级的SSO服务:

开启企业配置

首先,你需要修改 EnterpriseFeatureConfig 配置文件,启用企业级功能。

 class EnterpriseFeatureConfig(BaseSettings):    """    Configuration for enterprise-level features.    **Before using, please contact business@dify.ai by email to inquire about licensing matters.**    """
    ENTERPRISE_ENABLED: bool = Field(        description="Enable or disable enterprise-level features."        "Before using, please contact business@dify.ai by email to inquire about licensing matters.",        default=False,    )
    CAN_REPLACE_LOGO: bool = Field(        description="Allow customization of the enterprise logo.",        default=False,    )

企业的单点登录(SSO)配置信息

    @classmethod    def _fulfill_params_from_enterprise(cls, features):        enterprise_info = EnterpriseService.get_info()
        if "sso_enforced_for_signin" in enterprise_info:            features.sso_enforced_for_signin = enterprise_info["sso_enforced_for_signin"]
        if "sso_enforced_for_signin_protocol" in enterprise_info:            features.sso_enforced_for_signin_protocol = enterprise_info["sso_enforced_for_signin_protocol"]
        if "sso_enforced_for_web" in enterprise_info:            features.sso_enforced_for_web = enterprise_info["sso_enforced_for_web"]
        if "sso_enforced_for_web_protocol" in enterprise_info:            features.sso_enforced_for_web_protocol = enterprise_info["sso_enforced_for_web_protocol"]
        if "enable_email_code_login" in enterprise_info:            features.enable_email_code_login = enterprise_info["enable_email_code_login"]
        if "enable_email_password_login" in enterprise_info:            features.enable_email_password_login = enterprise_info["enable_email_password_login"]
        if "is_allow_register" in enterprise_info:            features.is_allow_register = enterprise_info["is_allow_register"]
        if "is_allow_create_workspace" in enterprise_info:            features.is_allow_create_workspace = enterprise_info["is_allow_create_workspace"]
        if "license" in enterprise_info:            license_info = enterprise_info["license"]
            if "status" in license_info:                features.license.status = LicenseStatus(license_info.get("status", LicenseStatus.INACTIVE))
            if "expired_at" in license_info:                features.license.expired_at = license_info["expired_at"]
  • 检查 enterprise_info 中是否有键 "sso_enforced_for_signin",如果有,将其值赋给 features.sso_enforced_for_signin。这表明是否启用强制单点登录(SSO)来进行用户登录

  • 检查是否有键 "sso_enforced_for_signin_protocol",并将其值赋给 features.sso_enforced_for_signin_protocol。这表明是否使用特定的协议(如 OAuth、SAML 等)来进行登录。

  • 检查 enterprise_info 中是否有键 "sso_enforced_for_web",并将其值赋给 features.sso_enforced_for_web。这表示是否强制 Web 应用使用单点登录(SSO)。

  • 检查是否有键 "sso_enforced_for_web_protocol",并将其值赋给 features.sso_enforced_for_web_protocol,表示 Web 应用使用的 SSO 协议。

企业单点信息获取
要实现或对接企业自有的SSO系统,可以通过如下代码实现信息获取:
from services.enterprise.base import EnterpriseRequestclass EnterpriseService:    @classmethod    def get_info(cls):        return EnterpriseRequest.send_request("GET""/info")
    @classmethod    def get_app_web_sso_enabled(cls, app_code):        return EnterpriseRequest.send_request("GET"f"/app-sso-setting?appCode={app_code}")
页面配置单点登录
在Dify平台上创建应用后,可以在应用的“监测-设置”页面中进行单点登录配置,选择是否启用WebApp SSO认证功能。

写在最后

Dify的多租户架构为企业级智能体平台的构建提供了强大的支持,而SSO(单点登录)功能则是这一架构中不可或缺的关键一环。企业在打造自己的智能体平台时,必须重视并配置SSO相关功能,以确保用户能够以单一身份登录,方便地在不同应用间无缝切换。特别是对于面向企业用户的商业版本,启用SSO不仅是提升用户体验的必要条件,也是确保企业级平台安全性和易用性的重要措施。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询