我目前希望在不同网络中的不同服务器上运行两个.Net应用程序。在其中一台服务器上,将托管API以从数据库提供敏感数据,然后在另一台服务器上,应用程序将向该API发送请求。在存储向API发送请求的应用程序的网络中,想法是拥有一个身份验证项目,该项目将对应用程序用户进行身份验证,并为他们提供oAuth Token,可用于查询其他网络上的API。
当请求到达API时,我想做的就是有一种方法来检查它们是否已被授权并且是真实的。
我在想,为了确保请求是真实的,我可以为这两个应用程序提供相同的oAuth加密密钥,然后API可以尝试解密令牌,如果成功,它是一个受信任的请求,因为它是用相同的加密的键。
我不确定这是否是一种检查身份验证的安全方式,并希望了解这是否是一个好主意。
答案 0 :(得分:0)
您所描述的内容似乎更像是一个简单的基于令牌的身份验证系统,而不是完整的OAuth授权框架。顾名思义,OAuth更多的是授予代表您行动的应用授权。
OAuth :授权的开放标准。开发始于2006年,因为来自Twitter和Google等公司的员工认为需要一套共享协议,规定 Web服务应如何授权其他网络应用访问其用户'信息。
(重点是我的,来源:Auth0 Identity Glossary)
不要误会我的意思,你可以通过完整的OAuth完成你想要的东西,但对于这个用例,它似乎没有必要。您可以通过使用JWT作为令牌格式实现基于令牌的身份验证系统来实现相同的目标;这有几个好处:
使用JWT,执行身份验证的应用程序与使用令牌的API之间的信任关系是通过JWT可以签名的事实建立的(使用对称密钥,这似乎是您的用例,或者使用非对称密钥)以确保除密钥持有者之外的任何人都不能生成此有效令牌。 JWT还支持加密,但签名足以建立信任关系,如果您在令牌本身中有敏感信息并希望保护其免受窃听,您只需要为混合加密。
在.NET中,您应该可以依靠以下Nuget包System.IdentityModel.Tokens.Jwt开始创建和验证使用对称密钥签名的JWT令牌。
答案 1 :(得分:0)
要解码字符串令牌,您需要使用用于生成加密令牌的秘密字符串。 这段代码对我有用:
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;
}