介绍
实施合格电子签名 (QES) 的一种形式是通过芯片中包含适合文档签名的电子证书的智能卡。此类卡是 ID 卡的扩展,其中芯片上的证书仅适用于识别,因为这些卡缺乏作为合格签名创建设备的能力。
尽管某些行业可能会为其智能卡添加签名功能,但智能卡作为标准文档签名的普遍使用可能仅限于葡萄牙等公民身份证中包含此功能的国家。出于这个原因,大多数用于文档签名的商业解决方案甚至都没有提到智能卡。
特别是对于 SharePoint,在应用商店中找到的任何用于管理文档的应用程序都没有以任何方式提及智能卡。
鉴于其作为一种不太常见的文档签名形式,在网上找不到太多关于如何集成 SharePoint 文档库和智能卡的综合方法的信息,以避免手动下载文档,使用智能卡的特定应用程序,然后将其重新上传为新版本。
虽然提供了一个功能齐全的演示,但本文的目的是确定浏览器需要的几个连接部分以及它们如何协同工作以使浏览器从服务器中提取文档,将其发送给卡的中间件进行签名,接收签名文件返回并将其存储在服务器中,而不是显示新用途或每个单独步骤的最佳实现。
为了让那些对 SharePoint 前端 Web 开发或桌面应用程序开发没有经验的人可以访问本文,其中包含了用于设置所需工具的初步部分。
设置环境
获取与您的卡兼容的SDK
因为整个过程中最令人生畏的部分是以编程方式签署您的文档,因为它涉及 USB 读卡器、证书、安全密码、时间戳服务器等。项目的总体难度大致是获取 SDK 的难度你的卡。
如果包含用于手动签名的软件的网页没有对 SDK 或 API 进行任何引用,请不要气馁,网络搜索可能会像我一样发现它[ Manual do SDK – Middleware do Cartão de Cidadão ]。
如果您找不到能够以编程方式与您的卡进行开箱即用交互的东西,另一种选择可能是欧洲标准 DSS 库。
设置 Sharepoint 开发环境
此解决方案是使用 SharePoint 框架 (SPFx) 制作的,但同样的功能可能可以通过扩展功能区和菜单的 Sharepoint 加载项 UI 命令来实现。
在选择 SPFx 时,需要设置一个开发环境。这并不难,但我推荐 YouTube 视频,因为它们包含文本版本中未包含的叙述者的评论,并表明在安装过程中会出现大量警告。
如果没有将应用程序部署到您的 SharePoint 租户的权限,设置 Microsoft 365 租户以进行开发将允许您执行所有测试和部署[ SharePoint 框架教程 - 设置您的 Microsoft 365 租户以进行开发]。
然后实际设置您的 SharePoint 框架 (SPFx) 开发环境[设置您的 SharePoint 框架 (SPFx) 开发环境]。
设置本地开发环境
解决方案的后半部分是以 Windows 应用程序的形式为 C# SDK 制作包装器,因此Visual Studio与选择的 .NET 桌面开发工作负载一起使用[安装 Visual Studio ]。对于不同语言、不同操作系统或取决于偏好的 SDK,不同的代码编辑器可能会提供更好的体验。
SPFx 扩展
生成基本 SPFx 扩展脚手架
为了向 Sharepoint Online 文档库添加新的可配置按钮,“构建您的第一个 ListView 命令集扩展” [构建您的第一个 ListView 命令集扩展]提供了坚实的基础,并提供以下注意事项:
在./src/extensions/helloWorld/HelloWorldCommandSet.manifest.json中,如果 yeoman 无法创建引用的图像,为了防止构建错误,一个快速的解决方案是简单地将它们注释掉。
<span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#800080">“</span><span style="color:#800080">项目”</span>:{
[…]
<span style="color:#008000"><em>// </em></span><span style="color:#008000"><em>"iconImageUrl": "icons/request.png",</em></span>
[…]
<span style="color:#008000"><em>// </em></span><span style="color:#008000"><em>"iconImageUrl": "icons/cancel.png",</em></span></span></span>
在./sharepoint/assets/element.xml中,我们可以定义一旦部署到服务器,新按钮将出现在文档库中,而不是通过指定适当的RegistrationId
[构建您的第一个 ListView 命令集扩展名] 出现在常规列表中。
<span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#0000ff"><</span><span style="color:#800000">元素</span><span style="color:#ff0000">xmlns </span><span style="color:#0000ff">=" </span><span style="color:#0000ff">http://schemas.microsoft.com/sharepoint/" </span><span style="color:#0000ff">> </span><span style="color:#0000ff">< </span><span style="color:#800000">CustomAction </span><span style="color:#ff0000">[…] </span><span style="color:#ff0000">RegistrationId </span><span style="color:#0000ff">=" </span><span style="color:#0000ff">101"</span>
</span></span>
./config/serve.json中定义的默认和可选页面仅用于本地测试,一旦部署到服务器,新按钮将出现在所有文档库中。
为文件 IO 添加 Web 服务
利用本地托管的 Web 服务,可以在浏览器上下文之外移动数据,而无需求助于浏览器插件。
尽管PnP/PnPjs 库提供了许多优势,但为简单起见,此解决方案仅使用基本的 SPFx 功能[ SharePoint 框架参考]和 SharePoint REST 服务[了解 SharePoint REST 服务]。
在./src/extensions/helloWorld/HelloWorldCommandSet.ts:
添加与 SharePont webservies (SPHttp*) 交互的引用会公开文档库,而与 common (Http*) 交互会公开包装的读卡器。
扩展接口允许方便地存储属性,包括作为blob
.
一些属性是特定于网页的,可以在onInit
每次用户导航到不同的库时重置它们:
其他属性特定于库列表中选定的项目,并且必须针对项目选择的每次更改进行重置: