JSON 网络令牌,使其特定于客户端
JSON web token, make it client specific
我已经使用 Json Web 令牌生成了令牌。我在生成令牌时使用以下参数
_tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
ValidateActor=true,
// Validate the JWT Issuer (iss) claim
ValidateIssuer = true,
ValidIssuer = "TokenIssuer",
// Validate the JWT Audience (aud) claim
ValidateAudience = true,
ValidAudience = "Audience",
// Validate the token expiry
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
问题是,令牌可以在任何其他计算机上使用,它会授权令牌有效。如果从不同的客户端计算机生成,我需要使令牌无效。
这种行为是有道理的。令牌是使用有效凭据生成的,并且可以在任何计算机上使用,直到它过期为止。
这就是 OAuth2 的重点。令牌并非特定于用户,而是特定于应用程序。
如果您仍然想将它绑定到特定计算机,那么您可以添加一些东西来标识原始计算机,例如 IP 地址、主机名、mac 地址可以唯一标识计算机的任何内容。您可以将此信息添加到生成的令牌本身,当使用令牌时,您只需检查它是否与原始数据匹配。
我猜您想将此作为一项安全措施,但我仍然认为您不应该那样使用该系统。令牌始终是安全的,因为它们始终在通过 HTTPS 加密的身份验证 header 中传递。
您应该始终通过 HTTPS 与您的身份验证服务器通信,以防止对请求进行任何形式的篡改和任何形式的请求拦截。
简答:否
长答案:
您正在寻找的是设备证明,即识别设备并确保只有该设备在通信的能力。这是一个众所周知的问题 - 它需要在 OS 级别控制设备,确保令牌不会被盗(通过应用程序漏洞利用、设备漏洞利用或通信漏洞利用)。这几乎是不可能的。
在 OAuth 中是 "even more impossible",因为服务器正在生成令牌,而不是客户端。这不是 OAuth 的设计目的。
在 HTTPS header 请求中使用 jwt 令牌没有问题。如果你想让第二个设备不能使用相同的令牌,我认为你必须在你的数据库中创建一个字段来存储用户设备的 MAC 地址,如果相同的用户和密码发送使用不同的 MAC 地址向服务器发出请求,确保用户未被授权。
我已经使用 Json Web 令牌生成了令牌。我在生成令牌时使用以下参数
_tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
ValidateActor=true,
// Validate the JWT Issuer (iss) claim
ValidateIssuer = true,
ValidIssuer = "TokenIssuer",
// Validate the JWT Audience (aud) claim
ValidateAudience = true,
ValidAudience = "Audience",
// Validate the token expiry
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
问题是,令牌可以在任何其他计算机上使用,它会授权令牌有效。如果从不同的客户端计算机生成,我需要使令牌无效。
这种行为是有道理的。令牌是使用有效凭据生成的,并且可以在任何计算机上使用,直到它过期为止。
这就是 OAuth2 的重点。令牌并非特定于用户,而是特定于应用程序。
如果您仍然想将它绑定到特定计算机,那么您可以添加一些东西来标识原始计算机,例如 IP 地址、主机名、mac 地址可以唯一标识计算机的任何内容。您可以将此信息添加到生成的令牌本身,当使用令牌时,您只需检查它是否与原始数据匹配。
我猜您想将此作为一项安全措施,但我仍然认为您不应该那样使用该系统。令牌始终是安全的,因为它们始终在通过 HTTPS 加密的身份验证 header 中传递。
您应该始终通过 HTTPS 与您的身份验证服务器通信,以防止对请求进行任何形式的篡改和任何形式的请求拦截。
简答:否
长答案:
您正在寻找的是设备证明,即识别设备并确保只有该设备在通信的能力。这是一个众所周知的问题 - 它需要在 OS 级别控制设备,确保令牌不会被盗(通过应用程序漏洞利用、设备漏洞利用或通信漏洞利用)。这几乎是不可能的。
在 OAuth 中是 "even more impossible",因为服务器正在生成令牌,而不是客户端。这不是 OAuth 的设计目的。
在 HTTPS header 请求中使用 jwt 令牌没有问题。如果你想让第二个设备不能使用相同的令牌,我认为你必须在你的数据库中创建一个字段来存储用户设备的 MAC 地址,如果相同的用户和密码发送使用不同的 MAC 地址向服务器发出请求,确保用户未被授权。