在 Android 上为 Microsoft Edge 编写 SPNEGO Authenticator

第三方可以在 Microsoft Edge for Android 中启用 SPNEGO 身份验证。 若要提供此身份验证,它们必须提供 SPNEGO Authenticator。 本文介绍 Edge 和 SPNEGO Authenticator 之间的接口。

简介

SPNEGO Authenticator 由 Android 服务提供。 验证器必须合并到由第三方提供、安装在用户设备上的应用中。 应用负责管理用于 SPNEGO 身份验证的任何帐户,以及与 SPNEGO 服务器的所有通信。

SPNEGO Authenticator 是 Android AccountAuthenticator。 因此,它必须遵循 AbstractAccountAuthenticator 中所述的模式。 它必须实现派生自 AbstractAccountAuthenticator的验证器类。

SPNEGO Authenticator 必须定义新的帐户类型。 帐户类型名称应派生自编写器的域名 (例如 com.example.spnego) 。 帐户类型必须定义为使用 customTokens ,并且必须支持“SPNEGO”功能 (HttpNegotiateConstants.SPNEGO_FEATURE) 。

Microsoft Edge 的接口

Edge 通过它提供的 Android 帐户类型查找 SPNEGO 验证器。 验证器定义的帐户类型通过 AuthAndroidNegotiateAccountType 策略传递到 Edge。

Edge 的接口通过 Android 帐户管理框架,特别是通过 AbstractAccountManager.getAuthToken 。 Edge,在 org.chromium.net.HttpNegotiateConstants 中定义了一些更多的键和值,这些键和值用于 的参数 getAuthToken和返回的结果捆绑包中。

getAuthToken 参数

调用 getAuthToken 时, authTokenType 为“SPNEGO:HOSTBASED:<spn>”,其中 <spn> 是请求的主体。 这始终是当前实现中基于主机的主体。 将来的版本可能允许其他类型的主体,但如果这样做,它们会使用不同的前缀。 SPNEGO Authenticators 应检查前缀。

捆绑 options 包包含以下密钥:

  • KEY_CALLER_PID
  • KEY_CALLER_UID
  • HttpNegotiateConstants.KEY_CAN_DELEGATE - 如果允许委派,则为 True;如果不允许,则为 false。

如果这是多轮身份验证序列的第二轮或更晚一轮,则它还包含以下密钥。

  • HttpNegotiateConstants.KEY_INCOMING_AUTH_TOKEN - 来自 WWW-Authenticate 标头的传入令牌,Base64 编码。
  • HttpNegotiateConstants.KEY_SPNEGO_CONTEXT - 上一轮验证器提供的 SPNEGO 上下文。 Microsoft Edge 将此捆绑包视为不透明对象,只是在轮次之间保留它。

getAuthToken 结果捆绑包

getAuthToken 的最终结果捆绑包 (作为 的返回值getAuthToken或通过 AccountAuthenticatorResponse) 返回,应包含 Android 文档中定义的帐户名称、帐户类型和令牌。 此外,捆绑包应包含以下密钥:

  • HttpNegotiateConstants.KEY_SPNEGO_RESULT - SPNEGO 结果代码。 这应该是 HttpNegotiateConstants 中定义的值之一。
  • HttpNegotiateConstants.KEY_SPNEGO_CONTEXT - 在下一轮身份验证中要返回到验证器的上下文。 仅当身份验证不完整时,才需要这样做。

实现建议

实现 SPNEGO 验证器时,应考虑以下建议。

  • SPNEGO 帐户验证器提供的每个帐户应对应于单个用户主体 (帐户) 由单个密钥分发中心提供。

  • 帐户验证器不应存储任何密码。 相反,它应存储用户主体的 TGT,并要求用户在 TGT 过期时重新输入其密码 (或其他身份验证数据) 。

  • 帐户验证器应为每个帐户保留授权应用程序列表 (或应用程序签名) ,并拒绝向其他应用程序提供服务令牌。 授权应用程序列表可以是:

    • 内置于帐户验证器中。
    • 可由系统管理员配置。
    • 可由用户配置。 在这种情况下,帐户验证器可能会选择允许用户在首次请求访问权限时动态授权新应用程序。

    验证器可以使用选项捆绑包的KEY_CALLER_UID字段获取调用应用的 uid,然后使用 或类似调用标识请求应用程序 context.getPackageManager().getNameForUid()

    这是确保用户运行的恶意应用不能以意外方式使用用户的凭据访问服务所必需的。 这一点很重要,因为按照前面所述使用自定义令牌选项 () 在获取身份验证令牌时禁用 Android 自己的签名检查。

  • 除非它内置于帐户验证器中,否则系统管理员或用户需要能够配置密钥分发中心的位置。

Microsoft Edge 中显示的错误代码

除了可以从验证器应用转发的错误代码外,尝试对请求进行身份验证时,还可能会显示以下错误:

  • ERR_MISSING_AUTH_CREDENTIALS:帐户信息不可用。 可以出于以下任一原因引发它。
    • 用户未登录到验证器应用,并且找不到符合条件的帐户。
    • 无法获取帐户信息,因为当前应用没有所需的权限。
    • 有多个符合条件的帐户,我们无法从用户那里获得选择。
  • ERR_UNEXPECTED:发生意外错误,请求已终止。
  • ERR_MISCONFIGURED_AUTH_ENVIRONMENT:由于应用配置中的某些问题,无法完成身份验证。 某些权限可能缺失。

使用 Logcat 在系统日志中搜索 cr_net_auth 标记,以获取有关这些错误原因的详细信息。

将验证器与 Microsoft Edge 配合使用

Edge 使用多个 策略来控制 SPNEGO 身份验证的使用。 若要启用 SPNEGO 身份验证,必须配置 AuthServerAllowList并且 AuthAndroidNegotiateAccountType 必须与 SPNEGO 验证器提供的帐户类型匹配。

内容许可证

注意

本页面的某些部分是根据 Chromium.org 创建和共享的作品所做的修改,并根据 Creative Commons Attribution 4.0 国际许可证中所述的条款进行使用。 可在此处找到原始页面。

Creative Commons 许可证
本作品根据 Creative Commons Attribution 4.0 International License 获得许可。

另请参阅