当前位置: 首页 > 知识库问答 >
问题:

Django REST框架中可配置的SAML SSO认证

华宇
2023-03-14

寻找Django REST框架(DRF)中的用例和支持客户定义的身份验证方法的见解:TokenAuthentication(默认),SAML 2.0 SSO,OAuth2联合登录。该方法是按客户帐户设置的。我知道我会为DRF中的所有用户启用SAML 2.0支持,但我不知道如何让我们软件中的每个用户帐户使用他们自己的身份验证引擎,方法和设置。DRF 似乎想要全有或全无配置。

我知道django-saml2-auth插件和这个StackOverflow问题SAML SSO Authentication with Django REST Framework。

Django-saml2-auth是一个很棒的插件,可能涉及到解决方案,但我没有看到如何在应用程序中的每个帐户上使用多种不同的身份验证方法的示例

更多详细信息:我希望允许每个客户支持帐户设置的方法,从而可以选择多种身份验证方法之一,例如 TokenAuthentication(默认情况下)或 SSO,并提供 SAML 2.0 或 Oauth2 设置。每个帐户都可以从启用的方法中进行选择。DRF 似乎希望启用单个身份验证提供程序。还没有摸索如何在这个框架中做到这一点。当前使用令牌身份验证作为默认身份验证系统。令牌身份验证仍将是大多数帐户的默认提供程序。我需要能够允许更复杂的企业客户切换身份验证方法。这就是挑战。添加 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 方法似乎是“全有或全无”,并为应用程序提供单一的身份验证提供程序映射。我很想对这种限制犯错!

共有1个答案

淳于健
2023-03-14

实现这一点的一个选择是使用身份提供者(IdP)作为身份代理,例如Keycloak。通过这种方式配置,您的Django应用程序将被配置为使用单个IdP进行SAML身份验证。然后,可以根据客户要求,为IdP支持的任何上游SAML / OAuth身份提供者配置IdP。

如何让用户找到正确的上游身份提供者,同时仍然拥有良好的用户体验,有几种选择。两个最明显的方法是为每个用户组配置一个自定义URL,并在登录时将该URL重定向到正确的IdP登录页面。或者,你可以在Django网站上有一个登录页面,询问他们的登录/电子邮件地址(没有密码),当他们进入时,它会查找与该用户相关的IdP URL,然后将他们发送到正确的位置。

虽然这不是Django模块/代码的问题解决方案,但它简化了Django端的身份验证,并将身份验证与专门设计来进行身份验证的外部服务分离,为应用程序提供了更大的灵活性(可能也更安全)。

 类似资料:
  • herosphpphp的配置信息都在app/configs文件夹中 configs目录中包含了该应用所有的相关配置文档: env 跟环境相关的配置,app配置,数据库配置。包含了三个环境, dev(开发), test(测试), prod(生产) autoload.config.php 自定义需要自动加载的类的配置 beans beans服务配置文件目录 models 模型配置文件夹 session

  • 问题内容: 我正在淘汰Java库中的所有硬编码值,并且想知道哪种框架最好(就零或接近零的配置而言)来处理运行时配置?我希望使用基于XML的配置文件,但这不是必需的。 如果您有框架方面的实践经验,请仅作答复。我不是在寻找例子,而是经验…… 问题答案: 如果您的硬编码值只是简单的键值对,则应查看java.util.Properties。它比xml简单得多,易于使用,并且实现起来很麻烦。 如果您正在使用

  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 我在 PLay 2 中将我的应用程序划分为不同的项目。但我刚刚意识到我不知道如何在同一台服务器中运行多个播放应用程序。 有人知道怎么做吗? 让我们假设这是不可能的,因此,我将在同一个根项目中部署多个播放应用程序(微服务将充当插件)。你认为这会打败微服务架构吗?。我会让每个模块独立行动。

  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 问题内容: 我有以下示例代码: 我需要查找将哪些SQL查询发送到数据库。 如何使用SQL Express和VS 2012剖析EF查询? 有什么工具吗? 问题答案: 您在这里有一些选择。 通过在运行时打印出来检查查询看到(我认为这仅适用于查询,可能不是最好在上述情况下) 使用管理工作室内置的SQL事件探查器 使用Entity Framework Profiler(一个非常好的第三方工具,带有试用版,