【发布时间】:2020-09-22 13:06:19
【问题描述】:
在 Django REST Framework (DRF) 中寻找一个用例并支持客户定义的身份验证方法:TokenAuthentication(默认)、SAML 2.0 SSO、OAuth2 联合登录。该方法是按客户帐户设置的。我知道我会为 DRF 中的所有用户启用 SAML 2.0 支持,但我不知道如何让我们软件中的每个用户帐户使用他们自己的身份验证引擎、方法和设置。 DRF 似乎想要一个全有或全无的配置。
我知道django-saml2-auth plugin 和这个 StackOverflow 问题SAML SSO Authentication with Django REST Framework
django-saml2-auth 是一个很棒的插件,很可能涉及到解决方案,但我没有看到有关如何在您的应用中为每个帐户使用多种不同身份验证方法的示例。
更多详情: 我想允许支持帐户设置的每个客户方法启用选项来选择多种身份验证方法之一,例如 TokenAuthentication(默认情况下)或 SSO 并提供 SAML 2.0 或 Oauth2 设置。每个帐户都可以从启用的方法中进行选择。 DRF 似乎希望启用单个身份验证提供程序。还不知道如何在这个框架中做到这一点。目前使用 TokenAuthentication 作为默认的认证系统。 TokenAuthentication 将仍然是大多数帐户的默认提供程序。我需要能够允许更复杂的企业客户切换身份验证方法。这就是挑战。添加 SAML2 很简单。使用 OAuth2 很简单。允许帐户选择其中任何一个,每个帐户都有自己的身份验证工作流程。这与 django-saml2-auth 解决的用例完全不同。该插件可能涉及解决方案,但这里的限制似乎是 DRF 用于定义身份验证提供程序的模型。我已经扫描了 DRF 和 django-saml2-auth 文档、代码和示例。我所见过的一切都无法预料到这一点。
我目前的工作理论是,我可以通过一点创造性思维来实现它。也许有一个不同的 URL 映射使用不同的登录/身份验证方法。必须在后续调用中提供的登录数据令牌可以具有自定义验证方法,该方法适用于所有支持的协议,而无需大量新代码块。所以我的直觉是问题是将登录过程映射到不通用的东西,并且需要某种类型的帐户配置预取。我建议的解决方案在企业案例的登录 URL 中。但 DRF 似乎仍然缺乏一种方法来定义每个帐户的身份验证过程。假设我通过 Okta 使用 SAML2,您使用 OneLogin,另一个人使用 OAuth2 提供程序,大多数客户使用默认的本机 TokenAuthentication。我们都是同一个 DRF 应用程序中的用户。但是我没有看到基于帐户定义身份验证引擎的方法。
我知道有一种可能的暴力方法来自定义被调用的方法来执行可能是非标准的登录操作,查询客户的配置,然后使用本机或联合身份提供程序。不过,我希望有更多的 DRF 探索者知道启用此功能的其他策略。
我知道这存在先有鸡还是先有蛋的综合症,除非您对提出请求的客户有所了解,否则您不会知道他们的配置是什么。我们很可能需要为启用 SAML 的企业客户支持不同的登录 URL。这样您就可以加载客户的配置。也许我们会做一些事情,比如使用这样的 URL:www.myproduct/login/the_customer_company。作为 Django REST 框架的新手,我不太清楚如何在 Django settings.py 或 urls.py 中连接不同的身份验证方法?默认的新用户配置将保持基于 TokenAuthentication,但客户可以根据请求配置 SAML 并使用包括公司名称在内的不同 URL。希望我的问题很清楚。我了解如何将 DRF 配置为使用 SAML SSO 而不是 TokenAuthentication,但我想允许客户配置设置。
DRF 和 django-saml2-auth 方法似乎是“全有或全无”,并为应用程序提供单个身份验证提供程序映射。我很想弄错那个限制!
【问题讨论】:
-
我目前正在进行的项目很快也会面临这个“问题”,所以我在浏览网页时要睁大眼睛,最近我遇到了这个 Django 插件。它已经存在了一段时间,但他们最近添加了对 DRF 的一些支持。我没有深入研究它,但可能值得你检查一下:dango-saml2-auth 如果你认为这可以提供解决方案,请告诉我
-
与我上面解释的 django-saml2-auth 不同。它在全局范围内切换 Django 的身份验证提供程序,而不是根据需要。想象一下你需要所有:默认情况下的 TokenAuthentication,SAML 2 和 Oauth2 在单个应用程序中。 Django 和该插件没有显示支持该模型的迹象。想象一下,我有一个产品被小公司/个人从业者使用到最大的企业。创建了一个帐户。启用企业的帐户可以选择将系统连接到其现有的 SAML 2.0。另一个可能更喜欢 Oatuh2。 Django REST 框架并不真正喜欢每个帐户身份验证提供程序。
-
@RichSadowsky 我很好奇您能否提供有关您最终实施的解决方案的最新信息。有一个相当废弃的 djangsaml2_tenant 项目github.com/eabglobal/djangosaml2_tenant 可能用处不大,但值得一提。
-
@PierreDrescher 我无法提供更新,因为当时我的团队在乌克兰进行了实际实施。我在开发完成之前离开了项目。对不起。
标签: django django-rest-framework single-sign-on saml-2.0 multi-tenant