Token中的信息

本文探讨了Windows操作系统中Token的相关信息,包括如何通过GetTokenInformation API获取Token_USER和Token_GROUPS等详细资料,同时指出了TOKEN_PRIVILEGE与USER RIGHTS的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Token中有哪些信息呢?这我们可以从一个api中得到,

GetTokenInformation                       https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx

想要获取的信息类别

TOKEN_INFORMATION_CLASS

typedef enum _TOKEN_INFORMATION_CLASS { 
  TokenUser                             = 1,
  TokenGroups,
  TokenPrivileges,
  TokenOwner,
  TokenPrimaryGroup,
  TokenDefaultDacl,
  TokenSource,
  TokenType,
  TokenImpersonationLevel,
  TokenStatistics,
  TokenRestrictedSids,
  TokenSessionId,
  TokenGroupsAndPrivileges,
  TokenSessionReference,
  TokenSandBoxInert,
  TokenAuditPolicy,
  TokenOrigin,
  TokenElevationType,
  TokenLinkedToken,
  TokenElevation,
  TokenHasRestrictions,
  TokenAccessInformation,
  TokenVirtualizationAllowed,
  TokenVirtualizationEnabled,
  TokenIntegrityLevel,
  TokenUIAccess,
  TokenMandatoryPolicy,
  TokenLogonSid,
  TokenIsAppContainer,
  TokenCapabilities,
  TokenAppContainerSid,
  TokenAppContainerNumber,
  TokenUserClaimAttributes,
  TokenDeviceClaimAttributes,
  TokenRestrictedUserClaimAttributes,
  TokenRestrictedDeviceClaimAttributes,
  TokenDeviceGroups,
  TokenRestrictedDeviceGroups,
  TokenSecurityAttributes,
  TokenIsRestricted,
  MaxTokenInfoClass
} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;


如此在这里我们一一获取下这些信息

1.TOKEN_USER: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379634(v=vs.85).aspx



2.TOKEN_GROUPS: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379624(v=vs.85).aspx





以及各种Attributes的意义
Value Meaning
SE_GROUP_ENABLED 0x00000004L

The SID is enabled for access checks. When the system performs an access check, it checks for access-allowed and access-denied access control entries (ACEs) that apply to the SID.

A SID without this attribute is ignored during an access check unless the SE_GROUP_USE_FOR_DENY_ONLY attribute is set.

SE_GROUP_ENABLED_BY_DEFAULT 0x00000002L

The SID is enabled by default.

SE_GROUP_INTEGRITY 0x00000020L

The SID is a mandatory integrity SID.

SE_GROUP_INTEGRITY_ENABLED 0x00000040L

The SID is enabled for mandatory integrity checks.

SE_GROUP_LOGON_ID 0xC0000000L

The SID is a logon SID that identifies the logon session associated with an access token.

SE_GROUP_MANDATORY 0x00000001L

The SID cannot have the SE_GROUP_ENABLED attribute cleared by a call to the 

### Python 中 Token 的基本概念与实现 #### 什么是 TokenToken 是一种字符串形式的安全令牌,通常用于身份验证和授权。它可以在客户端和服务端之间传递,用来证明用户的合法性而无需每次都重新输入用户名和密码。 --- #### 常见的 Token 类型 1. **JWT (JSON Web Token)** JWT 是目前最常用的 Token 格式之一,由三部分组成:Header、Payload 和 Signature。其结构如下所示: ```plaintext Header.Payload.Signature ``` - **Header**: 描述了签名算法以及 Token 类型。 - **Payload**: 存储声明(Claims),包括标准声明(如 `iss` 发行人)、公共声明和私有声明。 - **Signature**: 使用 HMAC SHA256 或 RSA 对前两部分进行加密生成。 在 Python 中可以通过第三方库 `PyJWT` 实现 JWT 的创建与解析[^4]。 2. **基于 Redis 的 Token** 这种方式利用 Redis 来存储 Token 及其关联数据(如用户 ID)。当服务接收到 Token 后会查询 Redis 数据库来判断 Token 是否合法及是否过期[^3]。 3. **Session-Based Token** Session Token 将用户状态保存在服务器端,每次请求都需要携带此 Token 以便识别用户的身份。 --- #### 如何生成 Token? 以下是使用 `itsdangerous` 库生成带有效期的 Token 示例: ```python from itsdangerous import TimedJSONWebSignatureSerializer as Serializer def generate_token(secret_key, salt=None, expires_in=3600): """ 生成带有有效期的 Token :param secret_key: 密钥 :param salt: 盐值 :param expires_in: 超时时间(单位:秒) :return: 返回生成的 Token 字符串 """ s = Serializer(secret_key, salt=salt, expires_in=expires_in) return s.dumps({'user_id': 1}).decode('utf-8') # user_id 替换为实际用户ID ``` 上述代码中,`generate_token` 函数通过指定密钥 (`secret_key`)、盐值 (`salt`) 和超时时间 (`expires_in`) 创建了一个 JSON Web Signature (JWS)[^4]。 --- #### 验证 Token 的有效性 下面是一个简单的 Token 验证逻辑示例: ```python def verify_token(token, secret_key, salt=None): """ 验证 Token 并获取其中的数据 :param token: 待验证的 Token :param secret_key: 加密时使用的密钥 :param salt: 加密时使用的盐值 :return: 解析后的数据字典或者 None 表示无效 """ try: s = Serializer(secret_key, salt=salt) data = s.loads(token) # 自动检测是否过期 return data['user_id'] # 提取用户ID或其他信息 except Exception as e: return None # 如果发生异常表示 Token 无效或已过期 ``` 在此过程中,如果 Token 已经过期或被篡改,则抛出异常并返回 `None`[^1]。 --- #### 结合 Flask 和 Redis 实现 Token 认证 为了增强系统的可扩展性和性能,在某些场景下可以结合 Flask 和 Redis 完成 Token 的管理。具体流程如下: 1. 用户登录成功后生成唯一 Token,并将其存入 Redis; 2. 设置 Redis Key 的生存时间为 Token 的有效期; 3. 接口接收 Token 请求时先从 Redis 查询是否存在对应记录; 4. 若存在且未过期则允许访问受保护资源;否则拒绝访问。 以下是一段简化版代码片段展示如何操作: ```python import redis from flask import request, jsonify rds = redis.StrictRedis(host='localhost', port=6379, db=0) @app.route('/protected') def protected(): token = request.headers.get('Authorization') if not rds.exists(token): # 判断 Redis 中是否有对应的 Token return jsonify({"error": "Invalid or expired token"}), 401 # 获取 Token 关联的信息(例如用户ID) user_info = rds.hgetall(token) return jsonify(user_info) ``` 以上实现了基于 Redis 的 Token 验证机制[^2]。 --- #### 处理 Token 过期的情况 对于已经过期但仍需延续有效性的场景,推荐采用 Refresh Token 方案。即每当 Access Token 即将到期时自动刷新一个新的 Token 继续维持当前会话。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值