> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 用户身份验证与所有权

> 将 Steam 的用户身份验证与所有权检查迁移到 XBOX GDK,涵盖用户登录、使用权与两平台之间的许可差异。

Steamworks 与 XBOX Game Development Kit(GDK)都提供了用于对用户进行身份验证、并验证他们是否拥有当前作品和/或尝试访问的附加内容的 API。但这些 API 的目标存在差异。

Steam API 用于在多人会话中验证用户身份,并通过所有权检查确认用户玩的是通过 Steam 商店获得的合法游戏副本。而 XBOX Game Development Kit(GDK)需要先让用户登录,这一步会隐式在 XBOX 服务中验证用户身份,并独立检查当前 Microsoft Store 账号是否有权访问该游戏。

在 XBOX Game Development Kit(GDK)中,用于身份验证与所有权检查的两个 API 面向不同平台,有时甚至面向完全不同的账号。因此,我们使用 *有资格* 一词来表示用户持有 Microsoft Store 颁发的、可玩当前游戏的有效许可证。有关这一点及其含义的更多信息,参见本主题稍后的“两平台之间的许可差异”一节。

## 用户身份验证

在 Steam 中,客户端启动游戏时用户总是“已登录”。除了初始化 API 之外,游戏无需其他操作就能访问用户的 Steam ID。Steam 中的身份验证指的是使用 `ISteamUser` API 通过 session ticket(点对点或专用服务器)、加密应用票据(经安全服务器)或 Steam Web API,验证用户预设的身份就是当前登录客户端并启动游戏的用户。身份验证之后,Steam Web 或 `ISteamUser` API 可使用票据验证当前游戏或其可下载内容(DLC)的所有权。

在 XBOX Game Development Kit(GDK)中,这一验证步骤并不必要,因为在你按照 [初始化 XBOX Game Development Kit(GDK)](/build/steam-porting-guide/initializing-the-gdk) 中的步骤为用户登录时,验证已经完成了。因此,XBOX Game Development Kit(GDK)并没有与 Steam 的 session ticket 或加密应用票据相对应的机制来在多人会话中验证用户身份。

## 所有权与数字版权管理(DRM)

要验证用户是否有资格玩当前游戏,你需要使用 `XStore` API 中的 [`XStoreQueryGameLicenseAsync`](/reference/system/xstore/xstore_members) 函数,检查用户是否拥有玩该游戏的许可证。在异步回调中检查:

1. 查询是否成功(即用户有许可证)。
2. 从 [`XStoreQueryGameLicenseResult`](/reference/system/xstore/xstore_members) 获得的许可证是否仍处于活动状态。

如果两项检查都通过,你可以认为用户有资格玩你的游戏。在 XBOX Game Development Kit(GDK)中,这最接近于在 Steam Web API 中使用 `ISteamUser/CheckAppOwnership`,或调用带 app ticket 的 `SteamEncryptedAppTicket::BIsTicketForApp`。

有关执行这一检查的更多信息与代码示例,参见 [XStore: 基础 DRM 与许可证检查](/publishing/xstore-commerce/xstore-basic-drm)。该主题还介绍了更稳健的许可证检查方案,以防止通过篡改绕过客户端检查。

Steam 还提供了 DRM 包装器,XBOX Game Development Kit(GDK)没有对应机制。Microsoft Store 会在启动从其安装的应用时进行反盗版检查。为获得完整的 DRM 保护,我们建议在运行上述链接示例代码中的许可证检查之外,还额外采用第三方方案。

## 检查 DLC 的所有权

如果你的游戏关联了 DLC,可以使用 `XStore` API 检查用户的 Microsoft Store 账号是否有权访问某个条目。要检查这些许可证,首先使用 [`XStoreQueryAssociatedProductsAsync`](/reference/system/xstore/xstore_members) 函数查询与游戏关联的所有产品,然后使用 [`XStoreAcquireLicenseForPackageAsync`](/reference/system/xstore/xstore_members) 函数(类似于 `ISteamUser/CheckAppOwnership` 或 `ISteamUser::UserHasLicenseForApp`)获取查询结果列表中特定 DLC 条目的许可证。

与游戏使用权检查一样,你需要检查许可证是否成功获取且处于活动状态。两项检查都通过时,你可以认为用户被授权访问该 DLC 条目。有关此流程的代码示例,参见 [管理并授权可选包(DLC)](/publishing/xstore-commerce/xstore-dlc)。

## 两平台之间的许可差异

请注意 Steam 与 Microsoft Store 在理念上的重要区别。在 Steam 中,许可证检查用于验证经身份验证的用户是否因为购买或通过 Steam Family Sharing 获得了当前游戏的许可证。

而 XBOX Game Development Kit(GDK)会检查当前经身份验证的 Microsoft Store 账号是否有权访问内容,并通过 XBOX 账号获取身份。这里有一个重要的注意点 —— 两个账号所使用的 Microsoft 账号 *可能不相同*,即使它们属于同一个人。因此,如果你希望限制某个游戏或其他 Microsoft Store 内容的许可证可以在多少台不同设备上玩,请务必熟悉 Microsoft Store 提供的不同许可模型。更多信息参见 [游戏的产品共享模型](/publishing/xstore-commerce/xstore-product-sharing)。


## Related topics

- [Steam 移植指南概览](/zh-CN/build/steam-porting-guide/overview.md)
- [Stats 与成就](/zh-CN/build/steam-porting-guide/features/stats-and-achievements.md)
- [身份验证](/zh-CN/services/xbox-services/fundamentals/identity/auth/index.md)
- [PlayFab 的 Microsoft 帐户身份验证](/zh-CN/services/playfab/identity/dev-identity/authentication/aad-authentication.md)
- [身份](/zh-CN/services/xbox-services/fundamentals/identity/index.md)
