【问题标题】:SCIM endpoint and user provisioning with Azure Active Directory & Symfony使用 Azure Active Directory 和 Symfony 进行 SCIM 端点和用户配置
【发布时间】:2020-05-19 16:22:55
【问题描述】:

我正在开发一个 SCIM 端点 API,以便在我的 symfony v5 应用程序和 Azure AD 之间自动配置用户。 实际上我没有找到足够的文档来帮助我开发这个,我也不是专家,但我遵循了 docs.microsoft 的一些指导方针。 我首先构建一个 symfony REST API CRUD 而不使用任何包,我所有的端点都由 /Users 开始。

然后我将我的应用程序托管在远程站点 (PLESK) 上,并使用此 url:https://example.com/ 现在我想将我的 SCIM 端点与 Azure AD SCIM 客户端集成。在 Tenant URL 字段中,我输入了这个 URL:https://example.com/scim 但我收到这个错误,如果我做对了,谁能解释我?为什么我会收到这个错误?

您似乎输入了无效的凭据。请确认您是 使用管理帐户的正确信息。错误 代码: SystemForCrossDomainIdentityManagementCredentialValidation 不可用 详细信息:我们收到了您的申请的意外回复: 返回了 HTTP/404 Not Found 响应,而不是预期的响应 HTTP/200 OK 响应。要解决此问题,请确保租户 网址是正确的。租户 URL 通常采用如下格式: https:///scim。如果这不能解决问题,请联系 应用程序开发人员确保他们的 SCIM 端点符合 协议https://www.rfc-editor.org/rfc/rfc7644#section-3.4.2

这是我的 API 控制器类示例创建用户:

class APIController extends AbstractController
{

//Create User
    /**
     * @Route("/Users", name="ajout", methods={"POST"})
     */
    public  function addUser(Request $request){
        //On verifie si on a une requette
// On vérifie si la requête est une requête Ajax
        //if($request->isXmlHttpRequest()) {
        // On instancie un nouvel article
        $user = new User();

        // On décode les données envoyées
        $donnees = json_decode($request->getContent());

        // On hydrate l'objet
        $user->setEmail($donnees->email);
        $user->setRoles($donnees->roles);

        // On sauvegarde en base
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();

        // On retourne la confirmation
        return new Response('ok', 201);
    }
    //return new Response('Failed', 404); }
} 

【问题讨论】:

  • 根据scim spec,配置必须尝试访问另一个资源以查看您的 api 支持什么。我猜这归结为您的 api 是部分实现。你可以交叉引用 symfony 应用程序日志来查看请求的资源吗?
  • 如果你的意思是 symfony 应用程序日志文件,我在再次测试后检查了它,但我没有发现任何东西。但如果你的意思是服务器日志,我还没有访问服务器的权限。跨度>
  • 是的,我的意思是应用程序日志文件,即使找不到路由(假设您已配置日志记录),也应该记录请求。您可以使用浏览器访问您的应用程序吗?设置正确吗?
  • 您应该小心,该应用程序是在dev 环境中配置的,启用了探查器,任何人都可以访问它。除此之外,还有两件事,1. 访问/Users 会导致InternalServerError,2. url 与您在azure 中配置的不同(它缺少/public/ 部分)。

标签: rest symfony azure-active-directory provisioning scim


【解决方案1】:

Azure AD 我们期待一个看起来像这样的响应。这将允许您验证信用。

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 0,
    "Resources": [],
    "startIndex": 1,
    "itemsPerPage": 20
}

https://docs.microsoft.com/en-us/azure/active-directory/app-provisioning/use-scim-to-provision-users-and-groups#get-user-by-query---zero-results

【讨论】:

    【解决方案2】:

    URL https://example.com/scim 将不起作用,因为您在 @Route 注释中没有定义前缀 scim,只有“用户”。网址https://example.com 也是。 可能 Azure 想要检查 GET 方法 - 因为在 SCIM 文档http://www.simplecloud.info/ 中只有这样的方法返回 200 响应代码。

    首先 - 指定 SCIM 中定义的所有需要​​的路由。

    其次 - 使用 Postman 并根据 http://www.simplecloud.info/ 文档手动测试路由,甚至更好 - 为它编写 e2e 测试 https://symfony.com/doc/current/testing.html#functional-tests

    下一步 - 确定你真正有效的 URL 是什么

    最后 - 在 Azure 测试工具中测试集成

    附言。为什么不是基于 Symfony 5 的 ApiPlatform?你会让一切变得更快。

    PS2。您可以观看一些现成的 Microsoft SCIM 参考代码(用于 C#,但仍然值得阅读 - 特别是 README)。 https://github.com/AzureAD/SCIMReferenceCode
    另外,关于测试的维基页面很棒,你应该检查它https://github.com/AzureAD/SCIMReferenceCode/wiki/Test-Your-SCIM-Endpoint

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多