我的目标是利用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 交换:
- 尝试获取
https://rms1.mydomain:443/my/v2/servicediscovery?email=user1@mydomain
- 这将返回带有预期的 WWW-Authenticate 标头的 401 响应:
WWW-Authenticate: Bearer realm="api.rms.rest.com", authorization="https://fs1.mydomain/adfs/oauth2/authorize"
- 将以下正文发布到
https://fs1.mydomain/adfs/oauth2/token
:grant_type=client_credentials&client_id=<ID>&client_secret=<SECRET>&resource=api.rms.rest.com
- 获取带有解码主体的签名的身份验证令牌,如下所示:
{"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"}
- 尝试再次获取服务发现 URI,这次添加以下标头:
Authorization: Bearer <TOKEN>
- 服务器返回 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”。
还有一些问题:
- 是否可以让 RMS 移动设备扩展接受不包含电子邮件声明的令牌?这是客户端 ID/客户端密钥身份验证正常运行所必需的。
- “/my/v1”和“/my/v2”之间有什么区别?如何知道该使用哪一个?