精华内容
下载资源
问答
  • jwt中的token里面包含哪些内容?

    千次阅读 2021-04-08 22:09:09
    JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 2、作用 1、Authorization (授权) ...

    1、定义

    JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

    2、作用

    1、Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

    2、Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

    3、结构

    生成的token结构是:header.payload.signature,例如:

    在这里插入图片描述
    接下来让我们来具体看一下这些结构中到底包含什么

    3.1、Header

    header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)

    在这里插入图片描述
    然后,用Base64对这个JSON编码就得到JWT的第一部分

    3.2、Payload

    JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户信息,也就是程序员放入token中的数据)和其他数据的声明。声明有三种类型: registered, public 和 private。

    Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
    Public claims : 可以随意定义。
    Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。

    在这里插入图片描述
    对payload进行Base64编码就得到JWT的第二部分

    注意: 不要在JWT的payload或header中放置敏感信息,除非它们是加密的。

    3.3、Signature

    为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。

    在这里插入图片描述
    签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。

    4、生成token的代码

    public class JwtUtils {
    
        // 设置token的过期时间是一天
        private static final long EXPIRE = 1000 * 60 * 60 * 24;
        // 加盐
        private static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
    
        /**
         * 获取token
         *
         * @param id       用户id
         * @param nickname 用户昵称
         * @return
         */
        public static String getJwtToken(String id, String nickname) {
    
            String JwtToken = Jwts.builder()
                    .setHeaderParam("typ", "JWT")
                    .setHeaderParam("alg", "HS256")
                    .setSubject("guli-user")
                    .setIssuedAt(new Date())
                    .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                    .claim("id", id)
                    .claim("nickname", nickname)
                    .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                    .compact();
    
            return JwtToken;
        }
        ………………
    }
    
    展开全文
  • 首先,我们先解释一下他的意思:1.Token介绍:Token经常在手机客户端向服务器端询问数据信息,服务器端经常去数据库查询登录名和登录密码并进行对比,以区分登录名和登录密码是否合适,并做相对提醒。在这样的情况下,...

    对于初学者来说,Token和Session的应用不可避免地局限于困境。在整个开发设计过程中,我们知道这个东西,却不知道为什么要用。不知道基本原理。今天我就带大家来分析一下这个事情。

    首先,我们先解释一下他的意思:

    1.Token介绍:Token经常在手机客户端向服务器端询问数据信息,服务器端经常去数据库查询登录名和登录密码并进行对比,以区分登录名和登录密码是否合适,并做相对提醒。在这样的情况下,Token应运而生。

    2.Token的定义:Token是服务器转换的字符串数组,作为手机客户端申辩的动态密码。第一次登录后,网络服务器将该令牌转换并返回给手机客户端。之后手机客户端只需要携带这个Token就可以为数据信息求情了,不用再携带登录名和登录密码。

    3.应用Token的目的:Token的目的是缓解网络服务器的工作压力,减少频繁的数据库查询,使网络服务器更强大。

    了解Token的实际意义后,我们会更好地理解为什么要使用它。

    二、Token怎么用?

    这是本文的重点,在这里我还详细介绍了两种常用的方法。

    1.使用机器设备的设备号/mac详细地址作为令牌(强烈推荐)

    手机客户端:登录时,手机客户端获取机器的设备号/mac详细地址,作为参数传送给服务器。

    服务器端:接收到主参数后,服务器端接受带有自变量的查询,并将其作为Token存储在数据库中,并在会话中设置Token。手机客户端每次高兴都要统一屏蔽,将手机客户端发送的令牌和服务器会话中的令牌进行比较。相同的海关放行,不同的海关拒收。

    分析:此时手机客户端和服务器统一了唯一的Token,保证每台机器都有唯一的通话。这种方法的缺陷是手机客户端必须以设备号/mac详细地址作为参数传输,服务器也必须存储;优点是手机客户端不需要重新登录。如果一次登录就可以一直使用,请求超时的问题由网络服务器解决。怎么处理?如果网络服务器的Token请求超时,网络服务器只需要在数据库查询中查找手机客户端发送的Token,另外取值到自变量Token,这样Token请求超时就被重新记录下来。

    2.使用会话值作为令牌

    移动客户端:移动客户端只需携带登录名和密码即可登录。

    手机客户端:手机客户端收到登录名和登录密码后,会进行区分。如果合适,它会将本地获得的sessionID作为Token返回给手机客户端,然后手机客户端只需要携带恳求数据信息即可。

    分析:这种方式的优点是方便,不需要存储数据信息,缺点是会话到期后,手机客户端必须重新登录才能浏览数据信息。

    3.整个申请过程中的问题及解决方法?

    刚才我们很轻松的详细介绍了Token的两种应用方法,但是在整个应用的过程中,还是有各种各样的问题。在令牌的第一种方法中,我们隐藏了当网络不稳定或有高并发请求时重复提交数据信息的问题。

    总结:以上是我在开发设计中应用Token和session的总结。如果有不恰当的描述,请立即改正,我会改正,谢谢。我理解应用方法越来越多。这里只做自我推荐,期待大家明确提出你的申请方式。我们一起讨论,一起学习,一起训练,一起发展。此外,我们将对我那些对这些方面缺乏了解的朋友表示一些帮助和感谢。

    本文由网上采集发布,不代表我们立场,转载联系作者并注明出处:http://www.wxztseo.com/seozmt/14414.html

    展开全文
  • Token中的信息

    千次阅读 2016-08-11 08:40:00
    Token中有哪些信息呢?这我们可以从一个api中得到, GetTokenInformation https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx 想要获取的信息类别 TOKEN_INFORMATION_CLASS ...

    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 AdjustTokenGroups function. However, you can use the CreateRestrictedToken function to convert a mandatory SID to a deny-only SID.

    SE_GROUP_OWNER 0x00000008L

    The SID identifies a group account for which the user of the token is the owner of the group, or the SID can be assigned as the owner of the token or objects.

    SE_GROUP_RESOURCE 0x20000000L

    The SID identifies a domain-local group.

    SE_GROUP_USE_FOR_DENY_ONLY 0x00000010L

    The SID is a deny-only SID in a restricted token. When the system performs an access check, it checks for access-denied ACEs that apply to the SID; it ignores access-allowed ACEs for the SID.

    If thi


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

    TOKEN_PRIVILEGE 跟USER RIGHTS还是有区别的

    typedef struct _TOKEN_PRIVILEGES {
      DWORD               PrivilegeCount;
      LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
    } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
    

    typedef struct _LUID_AND_ATTRIBUTES {
      LUID  Luid;
      DWORD Attributes;
    } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
    

    locally unique identifier

    (LUID) A 64-bit value that is guaranteed to be unique on the operating system that generated it until the system is restarted.

    唯一标志windows某存在对象 "X"  的身份

    An LUID_AND_ATTRIBUTES structure can represent an LUID whose attributes change frequently, 

    LUID_AND_ATTRIBUTES结构体能代表 状态经常发生变化的LUID,而LUID也可以代表一个PRIVILEGE....

    TOKEN_PRIVILEGES在内存中的形式



    Privilege 常量

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


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

    The TOKEN_OWNER structure contains the default owner security identifier (SID) that will be applied to newly created objects.

    上段说明TOKEN_OWNER 结构体包含了一个默认的SID,它被用于新创建的对象---? 内核对象 如EVENT,MUTANT,SEMAPHORE...?,有待校验

    A pointer to a SID structure representing a user who will become the owner of any objects created by a process using this access token. The SID must be one of the user or group SIDs already in the token.

    被这个token关联的进程所创建的对象,被该SID表示的"用户"拥有,这个"用户"可以是 个体用户或者组 ,前提使他们得出现在Token中



    注意这个SID代表着的用户和Toke关联的用户不是同一个对象,


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

    The TOKEN_PRIMARY_GROUP structure specifies a group security identifier (SID) for an access token.

    该TOKEN_PRIMARY_GROUP 结构体指定了一个 组SID


    A pointer to a SID structure representing a group that will become the primary group of any objects created by a process using this access token. 

    The SID must be one of the group SIDs already in the token.

    代表着 组 的一个SID,这个组 将成为 拥有这个TOKEN的进程所创建an的 所有对象 的Primary group


     TOKEN_DEFAULT_DACL

    A pointer to an ACL structure assigned by default to any objects created by the user. The user is represented by the access token.

    一个指向ACL结构体的指针,该结构体在用户进程创建对象的时候被默认分配给该对象,暂时不分析这部分


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

    The TOKEN_SOURCE structure identifies the source of an access token

    TOKEN_SOURCE 结构体说明了该token的来源

    typedef struct _TOKEN_SOURCE {
      CHAR SourceName[TOKEN_SOURCE_LENGTH];
      LUID SourceIdentifier;
    } TOKEN_SOURCE, *PTOKEN_SOURCE;
    SourceName

    Specifies an 8-byte character string used to identify the source of an access token. This is used to distinguish between such sources as Session Manager, LAN Manager, and RPC Server. A string, rather than a constant, is used to identify the source so users and developers can make extensions to the system, such as by adding other networks, that act as the source of access tokens.

    指定8字节长的字符串,用来表示TOken的来源,这可被用来却分诸如 Session Manager,LAN Manager,RPC Server等来源,用字符串而不是一个常量

    表示,方便用户,对系统进行扩展,比如添加其他的 网络,用来作为Token的来源

    SourceIdentifier

    Specifies a locally unique identifier (LUID) provided by the source component named by the SourceName member. This value aids the source component in relating context blocks, such as session-control structures, to the token. This value is typically, but not necessarily, an LUID.

    SourceName成员代表的来源组件 提供的本地唯一标识符....



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

    The TOKEN_TYPE enumeration contains values that differentiate between a primary token and an impersonation token.


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

    typedef enum _SECURITY_IMPERSONATION_LEVEL { 
      SecurityAnonymous,
      SecurityIdentification,
      SecurityImpersonation,
      SecurityDelegation
    } SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
    目前用不着,忽略直接pass

    If the access token is not an impersonation token, the function fails.

    如果token不是impersionation token函数失败


    TOKEN_SESSIONID

    indicates the Terminal Services session identifier that is associated with the token.If the token is associated with the terminal server client session, the session identifier is nonzero.In a non-Terminal Services environment, the session identifier is zero.

    If TokenSessionId is set with SetTokenInformation, the application must have the Act As Part Of the Operating System privilege, and the application must be enabled to set the session ID in a token.

    上段文字说明,TOEKN_SEESIONID 指出 与该token相关的 终端服务会话Terminal Services session ,如果相关Session是 Terminal Server Client session,则session id非0

    ,在 非终端  服务的环境下,session id为0,


    其他就不一一列举了,很多东西,自己还没仔细看过,上述样本贴码如下

    // TokenInformation.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <Sddl.h>
    #include <locale.h>
    VOID RetGroupDwordAttributesToStr(DWORD attributes,LPTSTR szAttributes )
    {
    	
    	UINT len = 0;
    	if(attributes & SE_GROUP_ENABLED)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_ENABLED | "));
    	if(attributes & SE_GROUP_ENABLED_BY_DEFAULT)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_ENABLED_BY_DEFAULT | "));
    	if(attributes & SE_GROUP_INTEGRITY)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_INTEGRITY | "));
    	if(attributes & SE_GROUP_INTEGRITY_ENABLED)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_INTEGRITY_ENABLED | "));
    	if(attributes & SE_GROUP_LOGON_ID)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_LOGON_ID | "));
    	if(attributes & SE_GROUP_MANDATORY)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_MANDATORY | "));
    	if(attributes & SE_GROUP_OWNER)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_OWNER | "));
    	if(attributes & SE_GROUP_RESOURCE)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_RESOURCE | "));
    	if(attributes & SE_GROUP_USE_FOR_DENY_ONLY)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_USE_FOR_DENY_ONLY | "));
    	
    	return;
    }
    
    VOID RetPrivDwordAttributesToStr(DWORD attributes,LPTSTR szAttrbutes)
    {
    	UINT len = 0;
    	if(attributes & SE_PRIVILEGE_ENABLED)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_ENABLED |"));
    	if(attributes & SE_PRIVILEGE_ENABLED_BY_DEFAULT)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_ENABLED_BY_DEFAULT |"));
    	if(attributes & SE_PRIVILEGE_REMOVED)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_REMOVED |"));
    	if(attributes & SE_PRIVILEGE_USED_FOR_ACCESS)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_USED_FOR_ACCESS |"));
    	if(szAttrbutes[0] == 0)
    		wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_DISABLED |"));
    	return ;
    }
    
    VOID PrintTokenInfoXX(HANDLE hToken,TOKEN_INFORMATION_CLASS tic )
    {
    	setlocale(LC_ALL,"");
    	switch(tic)
    	{
    		case TokenUser:
    		{
    			//The TOKEN_USER structure identifies the user associated with an access token.
    			//TOKEN_USER 结构体 是用来标志和 Token相关联的用户
    			PVOID ptu = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(
    				hToken,
    				tic,
    				ptu,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptu =(LPVOID) calloc(dwRet,1);
    					if(!GetTokenInformation(
    						hToken,
    						tic,
    						ptu,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenUser信息失败"),0,0);
    						return ;
    					}
    					
    					goto SUCCESS_TokenUser;
    				}
    				MessageBox(0,TEXT("获取TokenUser信息失败"),0,0);
    				return ;
    			}
    
    		SUCCESS_TokenUser:
    			LPTSTR lpszSID = NULL;
    			ConvertSidToStringSid( ((PTOKEN_USER)ptu)->User.Sid,&lpszSID );
    			_tprintf(TEXT("USER SID: %s\t"),lpszSID);
    			TCHAR name[MAX_PATH] = {0};
    			DWORD len1 = MAX_PATH;
    			DWORD len2 = MAX_PATH;
    			TCHAR domain[MAX_PATH] = {0};
    			SID_NAME_USE pnu;
    			LookupAccountSid(NULL,((PTOKEN_USER)ptu)->User.Sid,name,&len1,domain,&len2,&pnu);
    			_tprintf(TEXT("USER NAME: %s of domain %s\n"),name,domain);
    			LocalFree(lpszSID);
    			free(ptu);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenGroups:
    		{
    			PTOKEN_GROUPS ptg = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenGroups,
    				ptg,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptg = (PTOKEN_GROUPS)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenGroups,
    						ptg,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenGroups信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenGroups;
    				}
    				MessageBox(0,TEXT("获取TokenGroups信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenGroups:
    			for(int i = 0; i < ptg->GroupCount; i++)
    			{
    				LPTSTR lpszSID = NULL;
    				ConvertSidToStringSid((ptg->Groups+i)->Sid,&lpszSID);
    				_tprintf(TEXT("Group SID is %s\t"),lpszSID);
    
    				TCHAR name[MAX_PATH] = {0};
    				DWORD len1 = MAX_PATH;
    				DWORD len2 = MAX_PATH;
    				TCHAR domain[MAX_PATH] = {0};
    				SID_NAME_USE pnu;
    				LookupAccountSid(NULL,ptg->Groups[i].Sid,name,&len1,domain,&len2,&pnu);
    				_tprintf(TEXT("GROUP NAME: %s of domain %s"),name,domain);
    
    				TCHAR szAttributes[1024] = {0};
    				RetGroupDwordAttributesToStr((ptg->Groups + i)->Attributes,szAttributes);
    				_tprintf(TEXT("\n\t Attributes: %70s"),szAttributes);
    				_tprintf(TEXT("\n----------------------------------------------------------------------------------------\n"));
    				LocalFree(lpszSID);
    			}
    			free(ptg);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenPrivileges:
    		{
    			PTOKEN_PRIVILEGES ppriv = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenGroups,
    				ppriv,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ppriv = (PTOKEN_PRIVILEGES)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenPrivileges,
    						ppriv,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenPrivilege信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenPrivilege;
    				}
    				MessageBox(0,TEXT("获取TokenPrivilege信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenPrivilege:
    			for(int i = 0; i < ppriv->PrivilegeCount; i++)
    			{
    				TCHAR lpszPriv[MAX_PATH] = {0};
    				DWORD dwRet = MAX_PATH;
    				BOOL n=LookupPrivilegeName(
    					NULL,
    					&(ppriv->Privileges[i].Luid),
    					lpszPriv,
    					&dwRet
    					);
    				_tprintf(TEXT("[%d:]\t%s"),i,lpszPriv);
    				TCHAR lpszAttrbutes[1024] = {0};
    				RetPrivDwordAttributesToStr(ppriv->Privileges[i].Attributes,lpszAttrbutes);
    				_tprintf(TEXT("\n\t %s\n\n"),lpszAttrbutes);
    			}
    
    			free(ppriv);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenOwner:
    		{
    			PTOKEN_OWNER ptOwner = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenOwner,
    				ptOwner,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptOwner = (PTOKEN_OWNER)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenOwner,
    						ptOwner,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenOwner信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenOwner;
    				}
    				MessageBox(0,TEXT("获取TokenOwner信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenOwner:;
    			LPTSTR lpszSID = NULL;
    			ConvertSidToStringSid(ptOwner->Owner,&lpszSID);
    			_tprintf(TEXT("OWNER SID: %s\t"),lpszSID);
    			TCHAR name[MAX_PATH] = {0};
    			DWORD len1 = MAX_PATH;
    			DWORD len2 = MAX_PATH;
    			TCHAR domain[MAX_PATH] = {0};
    			SID_NAME_USE pnu;
    			LookupAccountSid(NULL,ptOwner->Owner,name,&len1,domain,&len2,&pnu);
    			_tprintf(TEXT("OWNER NAME: %s of domain %s\n"),name,domain);
    			LocalFree(lpszSID);
    			free(ptOwner);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    			
    		}
    		break;
    
    		case TokenPrimaryGroup:
    		{
    			PTOKEN_PRIMARY_GROUP ppg = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenPrimaryGroup,
    				ppg,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ppg = (PTOKEN_PRIMARY_GROUP)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenPrimaryGroup,
    						ppg,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenPrimaryGroup信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenPrimaryGroup;
    				}
    				MessageBox(0,TEXT("获取TokenPrimaryGroup信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenPrimaryGroup:;
    			LPTSTR lpszSID = NULL;
    			ConvertSidToStringSid(ppg->PrimaryGroup,&lpszSID);
    			_tprintf(TEXT("PRIMARY GROUP SID: %s\t"),lpszSID);
    			TCHAR name[MAX_PATH] = {0};
    			DWORD len1 = MAX_PATH;
    			DWORD len2 = MAX_PATH;
    			TCHAR domain[MAX_PATH] = {0};
    			SID_NAME_USE pnu;
    			LookupAccountSid(NULL,ppg->PrimaryGroup,name,&len1,domain,&len2,&pnu);
    			_tprintf(TEXT("GROUP NAME: %s of domain %s\n"),name,domain);
    			LocalFree(lpszSID);
    			free(ppg);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenDefaultDacl:
    		break;
    
    		case TokenSource:
    		{
    			PTOKEN_SOURCE pts = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenSource,
    				pts,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					pts = (PTOKEN_SOURCE)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenSource,
    						pts,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenSource信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenSource;
    				}
    				MessageBox(0,TEXT("获取TokenSource信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenSource:;
    			printf("Token Source NAME: %s\n",pts->SourceName);
    			free(pts);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenType:
    		{
    			PTOKEN_TYPE ptt = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenType,
    				ptt,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptt = (PTOKEN_TYPE)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenType,
    						ptt,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenType信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenType;
    				}
    				MessageBox(0,TEXT("获取TokenType信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenType:
    			_tprintf(TEXT("Token Type: %s\n"),(*ptt) == TokenPrimary?TEXT("TokenPrimary"):TEXT("TokenImpersonation"));
    			free(ptt);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenImpersonationLevel:
    		{
    			PSECURITY_IMPERSONATION_LEVEL psil = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenImpersonationLevel,
    				psil,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					psil = (PSECURITY_IMPERSONATION_LEVEL)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenImpersonationLevel,
    						psil,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenImpersonationLevel信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenImpersonationLevel;
    				}
    				MessageBox(0,TEXT("获取TokenImpersonationLevel信息失败,可能原因: 该Token不是Impersonation Token"),0,0);
    				
    				return ;
    			}
    			SUCCESS_TokenImpersonationLevel:
    			if((*psil) == SecurityAnonymous)
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityAnonymous"));
    			else if((*psil) == SecurityIdentification)
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityIdentification"));
    			else if((*psil) == SecurityImpersonation)
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityImpersonation"));
    			else
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityDelegation"));
    			free(psil);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenStatistics:
    		break;
    
    		case TokenRestrictedSids:
    		break;
    
    		case TokenSessionId:
    		{
    			DWORD dwSessionID = 0;
    			DWORD dwRet = sizeof(dwSessionID);
    			if(!GetTokenInformation(hToken,
    				TokenSessionId,
    				&dwSessionID,
    				dwRet,
    				&dwRet
    				))
    			{
    		
    				MessageBox(0,TEXT("获取TokenSessionId信息失败"),0,0);
    				return ;
    			}
    			_tprintf(TEXT("Session ID is %08X\n"),dwSessionID);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenGroupsAndPrivileges:
    		break;
    
    		case TokenSandBoxInert:
    		break;
    
    		case TokenOrigin:
    		break;
    
    		case TokenElevationType:
    		break;
    
    		case TokenLinkedToken:
    		break;
    
    		case TokenElevation:
    		break;
    
    		case TokenHasRestrictions:
    		break;
    
    		case TokenAccessInformation:
    		break;
    
    		case TokenVirtualizationAllowed:
    		break;
    
    		case TokenVirtualizationEnabled:
    		break;
    
    		case TokenIntegrityLevel:
    		break;
    
    		case TokenUIAccess:
    		break;
    
    		case TokenMandatoryPolicy:
    		break;
    
    		case TokenLogonSid:
    		break;
    
    		case TokenCapabilities:
    		break;
    
    		case TokenUserClaimAttributes:
    		break;
    
    		case TokenDeviceClaimAttributes:
    		break;
    
    		case TokenDeviceGroups:
    		break;
    
    		case TokenRestrictedDeviceGroups:
    		break;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLE hToken = NULL;
    	if(!OpenProcessToken(GetCurrentProcess( ),TOKEN_ALL_ACCESS,&hToken))
    	{
    		MessageBox(0,TEXT("Token获取失败"),0,0);
    		return 0;
    	}
    	TOKEN_INFORMATION_CLASS tic[31] = {
    		TokenUser,
    		TokenGroups,
    		TokenPrivileges,
    		TokenOwner,
    		TokenPrimaryGroup,
    		TokenDefaultDacl,
    
    		TokenSource,
    		TokenType,
    		TokenImpersonationLevel,
    		TokenStatistics,
    		TokenRestrictedSids,
    
    		TokenSessionId,
    		TokenGroupsAndPrivileges,
    		TokenSandBoxInert,
    		TokenOrigin,
    		TokenElevationType,
    
    		TokenLinkedToken,
    		TokenElevation,
    		TokenHasRestrictions,
    		TokenAccessInformation,
    		TokenVirtualizationAllowed,
    
    		TokenVirtualizationEnabled,
    		TokenIntegrityLevel,
    		TokenUIAccess,
    		TokenMandatoryPolicy,
    		TokenLogonSid,
    
    		TokenCapabilities,
    		TokenUserClaimAttributes,
    		TokenDeviceClaimAttributes,
    		TokenDeviceGroups,
    		TokenRestrictedDeviceGroups
    	};
    	const int total = 31;
    	for(int i = 0; i < total; i++) 
    		PrintTokenInfoXX(hToken,tic[i]);
    	return 0;
    }
    



    展开全文
  • token的基本内容

    千次阅读 2018-10-16 08:48:28
    1、token 的全称是json web token。 2、在http中,进行身份认证。 3、http通信是无状态的,客户端的请求到了服务端,服务端的答复无法对原来的客户端进行识别 4、传统使用session机制:客户端登录成功后,服务端返回...

    1、token 的全称是json web token。
    2、在http中,进行身份认证。
    3、http通信是无状态的,客户端的请求到了服务端,服务端的答复无法对原来的客户端进行识别
    4、传统使用session机制:客户端登录成功后,服务端返回一个sessionid给客户端,客户端将此保存在cookie中。需要再次发送请求时,携带cookie中的sessionid到服务端,服务端缓存了session,它就知道哪个用户发送了请求,并将返回内容给客户端。session可能存储到内存、磁盘或数据库,服务器需要定期去清理过期的session。
    5、token机制:客户端通过账号密码登录后,服务端会签发一个token,返回客户端。客户端将token存储到cookie、或localstorge( localstorge.set(item,propety))。发送请求时,将token放在请求头里面。服务端验证token后,就会验证token,成功的话就返回请求数据。服务端不需要存储用户的登录记录。

    展开全文
  • java后台获取小程序用户信息和生成自定义token,并使用filter过滤header的token源码.
  • Web项目中经常会用token来进行用户的访问验证,那么在获得token之后,如果有很多地方需要根据token获得对应的用户信息,你会怎么获取? 本文给大家提供N种方式,对照一下,看看你的项目中所使用的方式属于哪个Level...
  • Spring和Token整合详解

    千次阅读 2019-05-29 11:05:09
    Spring和Token整合详解 一、官方主页 Spring Security 二、概述 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web ...
  • JWT格式的Token动态库封装,包括获取token,验证token,获取token中保存的内容,验证了Token是否正确,验证了Token的ip是否相同,验证了Token的过期时间
  • springboot集成jwt实现token验证1、引入jwt依赖io.jsonwebtokenjjwt0.9.0com.auth0java-jwt3.9.02、自定义两个注解/*** 忽略Token验证**/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@...
  • 自己写的jmeter接口测试脚本(含有token),比较详细的描述了jmeter的测试流程,感兴趣的可以下载看看,如果某些资源涉及敏感信息,请联系
  • 通过ajax分配相应的clientID和Secret及用户名和...测试页面click_me_please_iframe.html包含相应的刷新和认证,同时refresh_token以文件的形式进行存储,方便下次程序直接使用,不必要在产生新的token;开发工具是vs2017
  • 既然前面有说到spring security 是如何验证当前用户以及获取到当前用户信息,哪么spring security auth2.0又是如何验证当前用户信息的呢? 技术详解: spring security auth2.0验证用户信息其实更加简单,具体的...
  • 文件中是一个极简单的小程序代码包,包括了三种方法:其中两种是获取用户信息和第三方token 的方法,一种是使用 header 向后台校验 token 的方法,配套的后台代码会在之后提供
  • token查看

    2021-08-13 02:45:33
    负载均衡器关联的资源如图1,包括监听器、转发策略、后端服务器组、健康检查和后端服务器。当您使用Token认证方式完成认证鉴权时,需要获取用户Token并在调用接口时增加“X-Auth-Token”到业务接口请求消息头中。...
  • 问题出在 DefaultUserAuthenticationConverter Line:52行 this.userClaimName 为固定值 "user_name" 所以重写方法convertUserAuthentication时,把user_name也加进去就解决了。...private static class ...
  • 1、原生js解析通过jwt解析token获取token中携带的信息 //data.data.normal_login_token为发送Ajax获取到的token信息 var strings = data.data.normal_login_token.split(".");//通过split()方法将token转为字符串 //...
  • 主要介绍了Java接口测试Cookie与token原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • SpringBoot整合Token

    千次阅读 2019-07-20 20:15:23
    SpringBoot整合TokenJWT什么是JSON Web Token?什么时候应该使用JSON Web令牌?什么是JSON Web令牌结构?HeaderPayloadSignature全部放在一起JWT工作原理SpringBoot集成引入依赖定义注解定义实体类编写...
  • 令牌的JSON模式包括:chainId,地址,名称,小数,符号,logoURI(可选),标签(可选)和自定义扩展元数据。 安装 npm install @solana/spl-token-registry yarn install @solana/spl-token-registry 例子 查询...
  • 主要介绍了Android使用token维持登陆状态的方法,包括token的概念及作用介绍,本文给大家介绍的非常详细,需要的朋友参考下吧
  • JWT token信息保存

    千次阅读 2017-09-29 20:04:00
    1、先来讲述一下token保存在浏览器端的几种不同的方式 (1)可以选择在cookie中进行保存,在服务端的代码为 String token = Jwt.createToken(payload); Cookie cookie = new Cookie("token", token); cookie....
  • 公司开发一个嵌入App的Web页面,安全方面使用老套路:App通过URL传参给前端(包含签名),前端把参数透传给H5后端验签,完事儿之后前端再决定用户是否合法。另外定义了N个JS方法前端根据固定GET参数判断是安卓还是...
  • Token的常用实现方式

    2021-08-12 03:05:22
    简述通常的Token在服务器端的实现方式有这几个:用SessionID实现Token的功能生成Token存在数据库(关系型数据库)生成Token存在Redis(非关系型数据库)使用Json Web Token (JWT)下面分析一下各个存储方式的优缺点...
  • token是计算机术语:令牌,令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。 ...
  • 一:JWT介绍:全称JSON Web Token,基于JSON的开放标准((RFC 7519) ,以token的方式代替传统的Cookie-Session模式,用于各服务器、客户端传递信息签名验证。 二:JWT优点: 1:服务端不需要保存传统会话信息,没有...
  • //这里是个例子,并包含了一个故意签发一个已过期的token data := jwt.StandardClaims{Subject:dataStr,ExpiresAt:time.Now().Unix()-1000} tokenInfo := jwt.NewWithClaims(jwt.SigningMethodHS256,data) //...
  • 一、使用网页授权access_token获取用户信息 前提:授权作用为snsapi_userinfo,才可以通过网页授权access_token和openid拉取用户信息了。 重点:网页授权access_token的获取,只要用户许可,就可以获得,不论用户...
  • Token是什么

    千次阅读 2020-01-16 11:02:12
    对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用它?更不知道其原理,今天我就带大家一起分析分析这东西。 一、我们先解释一下他的含义: 1、Token的...
  • 1、JWT简介JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案。session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将session_id放到cookie中。以后访问其他...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,080
精华内容 90,832
关键字:

token包含哪些信息

友情链接: 9ph1ppVS backup.rar