Microsoft 信息保护 SDK - 身份验证概念

通过扩展 类来实现首选的身份验证方法,在 MIP SDK mip::AuthDelegate 中执行身份验证。 mip::AuthDelegate 包含:

  • mip::AuthDelegate::OAuth2Challenge - 管理 OAuth2 颁发机构信息并针对客户端应用程序提供的类。
  • mip::AuthDelegate::OAuth2Token - 类管理从客户端应用程序 (和令牌存储) OAuth2 访问令牌获取。
  • mip::AuthDelegate::AcquireOAuth2Token() - 纯虚拟函数,其实现确定访问令牌获取的方法。 在 SDK 调用后,它将获取访问令牌,然后将它提供回 SDK 的身份验证逻辑。

mip::AuthDelegate::AcquireOAuth2Token 接受以下参数,并返回一个布尔值,指示令牌获取是否成功:

  • mip::Identity:要进行身份验证的用户或服务的标识(如果已知)。
  • mip::AuthDelegate::OAuth2Challenge:接受四个参数:authority、resource、claims 和scopes。mip::AuthDelegate::OAuth2Challenge 颁发 机构是生成令牌时要针对的服务。 资源 是我们正在尝试访问的服务。 调用 时,SDK 将处理将这些参数传递到委托中。 声明 是保护服务所需的标签特定声明。 作用域是Azure AD资源所需的权限范围。
  • mip::AuthDelegate::OAuth2Token:令牌结果将写入此对象。 加载引擎时,SDK 会使用它。 在身份验证实现之外,不需要在任何位置获取或设置此值。

重要提示: 应用程序不直接 调用。 SDK 将调用此函数(如果需要)。

Azure AD应用程序必须获得许可,才能获得访问帐户标识下的安全资源/API 的权限。 同意记录为对帐户租户中特定帐户的权限的永久确认 (用户同意) 或 (管理员同意) 。 根据所访问的 API 和应用程序正在寻求的权限以及用于登录的帐户,在各种方案中都发生许可:

  • 注册 应用程序的同 一租户中的帐户(如果你或管理员未通过"授予权限"功能显式预先许可访问权限)。
  • 如果应用程序 已注册 为多租户,并且租户管理员事先未预先同意所有用户,则来自不同租户的帐户。

枚举类实现一种易于使用的方法,允许应用程序开发人员根据 SDK 正在访问的终结点提供自定义 mip::Consent 许可体验。 通知可以告知用户要收集的数据、如何删除数据,或者法律或合规性策略所需的任何其他信息。 用户授予许可后,应用程序可以继续。

实现

通过扩展基类并实现 以返回枚举值之 mip::ConsentGetUserConsentmip::Consent 一来实现同意。

派生自 的对象 mip::Consent 将传入 mip::FileProfile::Settingsmip::ProtectionProfile::Settings 构造函数。

当用户执行需要提供许可的操作时,SDK 将调用 方法,以参数 GetUserConsent 方式传递目标 URL。 在此方法中,用户可以实现向用户显示必要的信息,从而让他们决定是否同意使用服务。

  • AcceptAlways:同意并记住决定。
  • 接受:同意一次。
  • 拒绝:不许可。

当 SDK 使用此方法请求用户同意时,客户端应用程序应该向用户显示 URL。 客户端应用程序应提供一些获取用户同意的方式,并返回对应于用户决策的适当许可枚举。

示例实现

class ConsentDelegateImpl final : public mip::ConsentDelegate {
public:
  ConsentDelegateImpl() = default;
  
  virtual mip::Consent GetUserConsent(const std::string& url) override;

};

当 SDK 需要许可时 GetUserConsentGetUserConsent将调用 方法,并调用作为参数传入的 URL。 在下面的示例中,将通知用户 SDK 将连接到提供的 URL,并为用户提供命令行上的选项。 根据用户的选择,用户接受或拒绝同意,并且同意将传递给 SDK。 如果用户拒绝许可,应用程序将引发异常,并且不会调用保护服务。

Consent ConsentDelegateImpl::GetUserConsent(const string& url) {
  //Print the consent URL, ask user to choose
  std::cout << "SDK will connect to: " << url << std::endl;

  std::cout << "1) Accept Always" << std::endl;
  std::cout << "2) Accept" << std::endl;
  std::cout << "3) Reject" << std::endl;
  std::cout << "Select an option: ";
  char input;
  std::cin >> input;

  switch (input)
  {
  case '1':
    return Consent::AcceptAlways;
    break;
  case '2':
    return Consent::Accept;
    break;
  case '3':
    return Consent::Reject;
    break;
  default:
    return Consent::Reject;
  }  
}

出于测试和开发目的,可以实施如下所示 ConsentDelegate 的简单方法:

Consent ConsentDelegateImpl::GetUserConsent(const string& url) {
  return Consent::AcceptAlways;
}

但是,在生产代码中,可能需要向用户提供许可选择,具体取决于区域或业务要求和法规。

下一步

为简单起见,演示委托的示例将调用外部脚本来实现令牌获取。 此脚本可以替换为任何其他类型的脚本、开源 OAuth2 库或自定义 OAuth2 库。