Microsoft Purview 信息保护 SDK 中的访问权限检查

合规门户中定义的信息权限管理权限由应用程序开发人员负责强制执行。 SDK 提供了一个 API 和一组枚举器来简化这些访问权限检查。

以下示例和表将演示哪些场景需要访问权限检查、要用于检查的权限列表以及如何执行检查。

权限列表和结果

有关完整的使用权限列表和说明,请参阅为 Azure 信息保护配置使用权限。 本文定义了应用程序开发人员在强制执行权限方面承担的职责,以及特定的权限存在或不存在时将会启用的功能。

重要

应用程序开发人员负责检查和强制执行权限。 不执行检查可能会导致数据丢失。

方案

应用程序执行访问权限检查的位置和方式取决于要构建的应用程序类型。 对于处理完整文件输出且没有用户界面的应用程序,最常使用的权限将是 EXTRACTOWNER。 具有用户界面的应用程序需要最精细的控制,阻止对应用程序中用户控件和导出路径的访问。 有关代码示例,请参阅执行访问权限检查部分。

没有用户界面的应用程序

没有用户界面的应用程序通常是基于服务的应用程序或命令行接口 (CLI)。 当应用程序处理由 Purview 信息保护进行保护的文件时,必须确保没有正确权限的用户无法使用服务或 CLI 以不受保护的格式导出文件。

这些应用程序应验证是否具备“所有者”或“提取”权限。 具有“所有者”权限的用户可以执行任何操作。 具有“提取”权限的用户可以直接移除保护或保存到新格式,即使该格式不支持保护。

有用户界面的应用程序

有用户界面的文件 SDK 应用程序必须实现相应的控制,来限制对用户无权执行的操作的访问。 此类应用程序的一个示例是 Azure 信息保护查看器。 该查看器会临时解密文件并在应用程序窗口中呈现内容。 该查看器在显示文档之前会执行精细访问权限检查,并根据访问权限检查的结果禁用相关的用户界面元素。

执行访问权限检查的部分工作流可能如下所示:

  • 用户是否具有“所有者”权限? 有则启用所有控件并停止处理其他权限。
  • 用户是否具有“打印”权限? 有则启用打印控件, 无则禁用打印控件。
  • 用户是否具有“导出”权限? 有则启用导出控件和 UI 元素, 无则禁用这些元素。
  • 用户是否具有“提取”权限? 有则启用复制和屏幕截图, 无则禁用这些功能。
  • 用户是否具有“编辑”权限? 有则启用编辑并保存当前项目, 无则将该项设为只读。

这些检查应针对权限列表和结果表中的所有权限执行,但“查看”权限除外。 如果没有此权限,则无法访问该文件。

执行访问权限检查

对于适用于 C++、.NET 和 Java 的文件和保护 SDK,用于执行访问权限检查的模式都相似。

这些代码示例假设你已完成初始化 SDK 的步骤,并实例化了引擎和处理程序。

使用 .NET 在文件 SDK 中执行访问权限检查

此代码截图假定已创建 FileHandler 并指向有效的文件。

// Validate that the file referred to by the FileHandler is protected.
if(handler.Protection != null)
{                
    // Validate that user has rights to remove protection from the file.                    
    if(handler.Protection.AccessCheck(Rights.Extract))
    {
        // If user has Extract right, remove protection and commit the change. Otherwise, throw exception. 
        handler.RemoveProtection();
        bool result = handler.CommitAsync(outputPath).GetAwaiter().GetResult();     
        return result;   
    }
    else
    {
        throw new Microsoft.InformationProtection.Exceptions.AccessDeniedException("User lacks EXPORT right.");
    }
}

使用 .NET 在保护 SDK 中执行访问权限检查

此代码截图假定已创建 ProtectionHandler 以供消耗。

// Validate that the file referred to by the FileHandler is protected.
if(protectionHandler != null)
{                
    // Validate that user has rights to remove protection from the file.                    
    if(protectionHandler.AccessCheck(Rights.Print))
    {
        // If the user has the print right, enable the control.
        // SetPrintControlEnabled() is an example and not a MIP SDK function.  
        SetPrintControlEnabled(true);
    }
    else
    {
        // If the user does not have the print right, disable the control.
        // SetPrintControlEnabled() is an example and not a MIP SDK function.  
        SetPrintControlEnabled(false);
    }
}

使用 C++ 在文件 SDK 中执行访问权限检查

此代码截图假定已创建 FileHandler 并指向有效的文件。

// Validate that the file referred to by the FileHandler is protected.
if (fileHandler->GetProtection() != nullptr)
{
    if (fileHandler->GetProtection()->AccessCheck(mip::rights::Extract()))
    {
        auto commitPromise = std::make_shared<std::promise<bool>>();
        auto commitFuture = commitPromise->get_future();
        fileHandler->RemoveProtection();
        fileHandler->CommitAsync(outputFile, commitPromise);
        result = commitFuture.get();
    }
    else
    {
        throw std::runtime_error("User doesn't have EXTRACT right.");
    }
}

使用 C++ 在保护 SDK 中执行访问权限检查

此代码截图假定已创建 ProtectionHandler 以供消耗。

// Validate that the file referred to by the FileHandler is protected.
if (protectionHandler != nullptr)
{
    if (protectionHandler->AccessCheck(mip::rights::Print()))
    {
        // If the user has the print right, enable the control.
        // SetPrintControlEnabled() is an example and not a MIP SDK function.  
        SetPrintControlEnabled(true);
    }
    else
    {
        // If the user does not have the print right, disable the control.
        // SetPrintControlEnabled() is an example and not a MIP SDK function.  
        SetPrintControlEnabled(false);
    }
}

后续步骤

现在,你已了解如何正确执行访问权限检查并强制执行与这些检查关联的权限,下面请继续学习文件处理程序概念,详细了解如何移除文件中的保护。