首页 > 解决方案 > 在 Rails 应用中获取 Azure AD 目录用户

问题描述

我有一个 Rails 6 应用程序,我想使用 Azure Active Directory 作为身份验证系统(使用开放 id 连接、saml2 和 ldap)。认证完成。现在我正在尝试显示用户信息,例如姓名或电子邮件地址。我还希望能够导出目录的所有用户。

我试图像这样设置配置:

这是我希望工作的一段代码:

def update_oidc
    identity_provider = IdentityProvider.find_by(provider_type: 'open_id_connect', id: params[:id])
    client_id = params[:client_id].strip
    metadata_url = params[:metadata_url].strip
    tenant_id = params[:tenant_id].strip

    metadata = HTTParty.get(metadata_url).parsed_response

    identity_provider.update(config: {
      metadata: metadata,
      metadata_url: metadata_url,
      client_id: client_id,
      tenant_id: tenant_id,
    })

    if tenant_id 
      directory_access_url = "https://graph.windows.net/#{tenant_id}/users?api-version=1.6"
      result = HTTParty.get(directory_access_url).parsed_response

      identity_provider.directories.find_or_create_by(tenant_id: tenant_id).update(
        business_phones: result["business_phones"],
        display_name: result["display_name"],
        given_name: result["given_name"],
        job_title: result["job_title"],
        email: result["user_principal_name"],
        mobile_phone: result["mobile_phone"],
        office_location: result["office_location"],
        surname: result["surname"]
      )
    end

    redirect_to identity_provider
  end

由于tenant_id是目录 ID,我认为我们可以通过这种方式访问​​用户信息(并遵循 Microsoft Docs)。问题是,它不起作用,因为即使我在我的应用程序中连接到我的 Azure AD 目录,当我运行时result = HTTParty.get(directory_access_url).parsed_response,我有一个身份验证错误,告诉我令牌已过期或我需要连接。

我不想使用 PowerShell 或类似的东西。我希望能够通过我的应用程序访问目录数据。

有人可以告诉我我做错了什么或想出一个主意吗?

谢谢

标签: ruby-on-railsrubyazure-active-directory

解决方案


仅根据您的代码,我认为您希望Get users使用jnunemaker/httparty库通过 Azure AD Graph REST API 获取用户集合。

但是,它似乎缺少所需的标头Authorization及其值,如官方文件Bearer eyJ0eX ... FWSXfwtQ的部分所述。同时,您已经完成了身份验证,但 Azure AD Graph API 需要访问令牌作为OAuth2 的值,如下面的内容所述。Authentication and authorizationOperations overview | Graph API conceptsOpenID ConnectAuthorization

Graph API 根据令牌中存在的 OAuth 2.0 权限范围执行授权。有关 Graph API 公开的权限范围的更多信息,请参阅Graph API 权限范围

为了让您的应用通过 Azure AD 进行身份验证并调用 Graph API,您必须将其添加到您的租户并将其配置为需要 Windows Azure Active Directory 的权限(OAuth 2.0 权限范围)。有关添加和配置应用程序的信息,请参阅将应用程序与 Azure Active Directory 集成

Azure AD 使用 OAuth 2.0 身份验证协议。你可以详细了解 Azure AD 中的 OAuth 2.0,包括 Azure AD 中OAuth 2.0 中支持的流和访问令牌。

因此,恐怕您必须再次通过 Azure AD 的 OAuth2 手动获取访问令牌才能使用 Graph API,或者只是简单地参考samples/authorization_code_example/web_app.rb使用Rubyadal的 GitHub 存储库库的示例代码。AzureAD/azure-activedirectory-library-for-ruby


推荐阅读