oAuth 令牌身份验证 - 使用相同的密钥
oAuth Token Authentication - using same secret key
我目前想要两个 .Net 应用程序 运行 在不同网络中的不同服务器上。在其中一台服务器上,API 将托管以提供来自数据库的敏感数据,然后在另一台服务器上,应用程序将向该 API 发送请求。在存储向 API 发送请求的应用程序的网络中,我们的想法是拥有一个身份验证项目,该项目将对应用程序用户进行身份验证并为他们提供可用于查询 API 的 oAuth 令牌在另一个网络上。
当请求到达 API 时,我想做的就是有一种方法来检查它们是否已被授权并且是真实的。
我在想,为了确保请求是真实的,我可以为两个应用程序提供相同的 oAuth 加密密钥,然后 API 可以尝试解密令牌,如果成功,它就是一个受信任的请求,因为它是用相同的密钥加密的。
我不确定这是否是一种检查身份验证的安全方法,我想就这是否是个好主意征求一些意见。
您所描述的似乎更像是一个简单的基于令牌的身份验证系统,而不是完整的 OAuth 授权框架。顾名思义,OAuth 更多的是授予应用程序代表您行事的授权。
OAuth: An open standard for authorization. Development began in 2006 as employees from companies like Twitter and Google saw the need for a set of shared protocols dictating how web services should authorize other web apps to access to their users' information.
(重点是我的,来源:Auth0 Identity Glossary)
不要误会我的意思,您可以通过完整的 OAuth 来完成您想要的,但对于这个用例,它似乎没有必要。您可以通过使用 JWT 作为令牌格式实现基于令牌的身份验证系统来实现相同的目的;这有几个好处:
- 这比必须完全理解 OAuth 并实施您自己的兼容授权服务器要简单。即使您选择部署开源替代方案,您仍然需要确保一切都是安全的或禁用您不需要的一切。 (我已经经历过那种经历,除非我确信有足够的时间和资源去做,否则我不会再这样做了)
- 您的 API 将已经接受 JWT 令牌作为身份验证,因此如果您将来确实需要进行完整的 OAuth,您的 API 已经准备就绪。
使用 JWT,执行身份验证的应用程序与使用令牌的 API 之间的信任关系是通过可以对 JWT 进行签名(使用对称密钥,这似乎是您的用例)这一事实建立的,或使用非对称密钥)以确保除了密钥持有者之外没有人可以生成此有效令牌。 JWT 也支持加密,但是签名足以建立信任关系,如果你的令牌本身有敏感信息并且想保护它不被窃听,你只需要将加密加入混合。
在 .NET 中,您应该能够开始创建和验证使用对称密钥签名的 JWT 令牌,方法是依赖以下 Nuget 包 System.IdentityModel.Tokens.Jwt。
要解码字符串令牌,您需要用于生成加密令牌的秘密字符串。
此代码对我有用:
protected string GetName(string token)
{
string secret = "this is a string used for encrypt and decrypt token";
var key = Encoding.ASCII.GetBytes(secret);
var handler = new JwtSecurityTokenHandler();
handler.ReadToken(token);
var tokenSecure = handler.ReadToken(token) as SecurityToken;
var validations = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
var claims = handler.ValidateToken(token, validations, out tokenSecure);
return claims.Identity.Name;
}
我目前想要两个 .Net 应用程序 运行 在不同网络中的不同服务器上。在其中一台服务器上,API 将托管以提供来自数据库的敏感数据,然后在另一台服务器上,应用程序将向该 API 发送请求。在存储向 API 发送请求的应用程序的网络中,我们的想法是拥有一个身份验证项目,该项目将对应用程序用户进行身份验证并为他们提供可用于查询 API 的 oAuth 令牌在另一个网络上。
当请求到达 API 时,我想做的就是有一种方法来检查它们是否已被授权并且是真实的。
我在想,为了确保请求是真实的,我可以为两个应用程序提供相同的 oAuth 加密密钥,然后 API 可以尝试解密令牌,如果成功,它就是一个受信任的请求,因为它是用相同的密钥加密的。
我不确定这是否是一种检查身份验证的安全方法,我想就这是否是个好主意征求一些意见。
您所描述的似乎更像是一个简单的基于令牌的身份验证系统,而不是完整的 OAuth 授权框架。顾名思义,OAuth 更多的是授予应用程序代表您行事的授权。
OAuth: An open standard for authorization. Development began in 2006 as employees from companies like Twitter and Google saw the need for a set of shared protocols dictating how web services should authorize other web apps to access to their users' information.
(重点是我的,来源:Auth0 Identity Glossary)
不要误会我的意思,您可以通过完整的 OAuth 来完成您想要的,但对于这个用例,它似乎没有必要。您可以通过使用 JWT 作为令牌格式实现基于令牌的身份验证系统来实现相同的目的;这有几个好处:
- 这比必须完全理解 OAuth 并实施您自己的兼容授权服务器要简单。即使您选择部署开源替代方案,您仍然需要确保一切都是安全的或禁用您不需要的一切。 (我已经经历过那种经历,除非我确信有足够的时间和资源去做,否则我不会再这样做了)
- 您的 API 将已经接受 JWT 令牌作为身份验证,因此如果您将来确实需要进行完整的 OAuth,您的 API 已经准备就绪。
使用 JWT,执行身份验证的应用程序与使用令牌的 API 之间的信任关系是通过可以对 JWT 进行签名(使用对称密钥,这似乎是您的用例)这一事实建立的,或使用非对称密钥)以确保除了密钥持有者之外没有人可以生成此有效令牌。 JWT 也支持加密,但是签名足以建立信任关系,如果你的令牌本身有敏感信息并且想保护它不被窃听,你只需要将加密加入混合。
在 .NET 中,您应该能够开始创建和验证使用对称密钥签名的 JWT 令牌,方法是依赖以下 Nuget 包 System.IdentityModel.Tokens.Jwt。
要解码字符串令牌,您需要用于生成加密令牌的秘密字符串。 此代码对我有用:
protected string GetName(string token)
{
string secret = "this is a string used for encrypt and decrypt token";
var key = Encoding.ASCII.GetBytes(secret);
var handler = new JwtSecurityTokenHandler();
handler.ReadToken(token);
var tokenSecure = handler.ReadToken(token) as SecurityToken;
var validations = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
var claims = handler.ValidateToken(token, validations, out tokenSecure);
return claims.Identity.Name;
}