如何使用 Active Directory 联合身份验证服务的持有者令牌对 Active Directory 权限管理服务进行身份验证

如何使用 Active Directory 联合身份验证服务的持有者令牌对 Active Directory 权限管理服务进行身份验证

我的目标是利用Microsoft 权限管理 SDK 4.2在Linux系统上访问和管理受保护的文档。

我无法通过联合服务器向 RMS 服务器进行身份验证(这是 SDK 所需的设置)。

我有以下设置:

  • 域控制器 dc1.mydomain
  • 权限管理服务器 rms1.mydomain,带有 Active Directory 权限管理服务、SQL Server 和 AD RMS 的移动设备扩展
  • 运行联合服务的身份验证服务器 fs1.mydomain

群集中的所有主机都运行 Windows Server 2016,并具有由注册机构签名的证书。根 CA 和中间 RA 证书安装在主机上。联合身份验证服务的令牌签名证书和令牌解密证书也由 RA 签名。

Microsoft Office 应用程序(使用较早的 SOAP 协议)能够与 RMS 服务通信。RIghts Management SDK 库使用移动设备扩展提供的更轻量级的 JSON 协议。

我已经为 _rmsdisco._http._tcp.mydomain 配置了 SRV DNS 记录。

移动设备扩展已配置为使用https://fs1.mydomain进行身份验证。

在 fs1.mydomain 上,我配置了一个“访问 Web API 的服务器应用程序”。服务器应用程序具有客户端 ID <ID> 和客户端密钥 <SECRET>。Web API 具有依赖方标识符 api.rms.rest.com。

我无法让 RMS SDK 客户端使用客户端应用程序凭据向 RMS 服务器进行身份验证。这是失败的 oauth2 交换:

  1. 尝试获取https://rms1.mydomain:443/my/v2/servicediscovery?email=user1@mydomain
  2. 这将返回带有预期的 WWW-Authenticate 标头的 401 响应:
    WWW-Authenticate: Bearer realm="api.rms.rest.com", authorization="https://fs1.mydomain/adfs/oauth2/authorize"
  3. 将以下正文发布到https://fs1.mydomain/adfs/oauth2/token
    grant_type=client_credentials&client_id=<ID>&client_secret=<SECRET>&resource=api.rms.rest.com
  4. 获取带有解码主体的签名的身份验证令牌,如下所示:
    {"aud":"microsoft:identityserver:api.rms.rest.com","iss":"http://fs1.mydomain/adfs/services/trust","iat":1553792250,"exp":1553795850,"apptype":"Confidential","appid":"<ID>","authmethod":"http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password","auth_time":"2019-03-28T16:57:30.037Z","ver":"1.0"}
  5. 尝试再次获取服务发现 URI,这次添加以下标头:
    Authorization: Bearer <TOKEN>
  6. 服务器返回 401 响应而不是 200。

我假设服务器配置中存在错误,但不知道是什么。我没有看到 RMS 服务器中记录的任何内容,但我猜想它无法验证 oauth 令牌。令牌签名证书存在于联合服务器提供的 FederationData.xml 中。我还在 RMS 服务器上的“证书”下安装了它(证书颁发机构证书也存在)。

此刻,我陷入困境,因此寻求帮助。

答案1

抱歉,我回答了自己的问题。持有者令牌的问题似乎不是无法验证签名,而是有效载荷中缺少声明(猜测是电子邮件)。

按照文档安装并配置 AD RMS 移动设备扩展这里

还有一些需要做的事情没有记录下来(我猜是 Windows Server 2016 的新功能)。在 Powershell 中添加 ADFS 客户端后,例如 MAC OS X RMS 共享应用程序:

Add-AdfsClient -Name "RMS Sharing App for macOS" -ClientId "96731E97-2204-4D74-BEA5-75DCA53566C3" -RedirectUri @("com.microsoft.rms-sharing-for-osx://authorize")

然后您需要授予客户端 ID 访问受保护资源的权限(即使您配置了“允许所有用户访问”):

Grant-AdfsApplicationPermission -ClientRoleIdentifier "96731E97-2204-4D74-BEA5-75DCA53566C3" -ServerRoleIdentifier "api.rms.rest.com"

现在,您可以使用客户端 ID 和域用户的有效凭据进行身份验证。身份验证请求正文变为:
grant_type=password&client_id=96731e97-2204-4d74-bea5-75dca53566c3&username=user1@mydomain&password=mypassword&resource=api.rms.rest.com

返回的令牌具有如下有效负载:
{"aud":"microsoft:identityserver:api.rms.rest.com","iss":"http://fs1.mydomain/adfs/services/trust","iat":1553874942,"exp":1553878542,"email":"user1@mydomain","upn":"user1@mydomain","apptype":"Public","appid":"96731E97-2204-4D74-BEA5-75DCA53566C3","authmethod":"urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport","auth_time":"2019-03-29T15:55:42.124Z","ver":"1.0"}

此令牌已被 RMS 服务器接受。

一个小细节:服务发现 URL 不太正确。即使使用有效的承载令牌,尝试访问https://rms1.mydomain:443/my/v2/servicediscovery?email=user1@mydomain也会导致 404 响应。将“v2”替换为“v1”,响应为 200。我的困惑是由于 SDK 有效地硬编码了“/my/v2”。

还有一些问题:

  1. 是否可以让 RMS 移动设备扩展接受不包含电子邮件声明的令牌?这是客户端 ID/客户端密钥身份验证正常运行所必需的。
  2. “/my/v1”和“/my/v2”之间有什么区别?如何知道该使用哪一个?

相关内容