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

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

以下示例和表格说明了哪些场景需要进行访问权限检查、需要核对的权限列表,以及如何执行该检查。

权限列表和结果

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

重要

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

Scenarios

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

没有用户界面的应用程序

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

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

具有用户界面的应用程序

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

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

  • 用户是否具有 所有者 权限? 如果是,请启用所有控件并停止处理其他权限。
  • 用户是否具有 PRINT 权限? 如果是,请启用打印控件。 否则,请禁用打印控件。
  • 用户是否具有 EXPORT 权限? 如果是,请启用导出控件和 UI 元素。 否则,请禁用这些元素。
  • 用户是否具有 EXTRACT 权限? 如果是,请启用复制和屏幕截图。 否则,请禁用这些函数。
  • 用户是否具有 编辑 权限? 如果是,请启用编辑并保存当前项目。 否则,将该项设为只读。

对 权限列表和结果 表中除 VIEW 权限之外的所有权限执行这些检查。 如果没有此权限,将无法访问该文件。

执行访问权限检查

用于执行访问检查的模式在适用于 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);
    }
}

后续步骤

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