oAuth令牌认证 - 使用相同的密钥

问题描述 投票:1回答:2

我目前希望在不同网络中的不同服务器上运行两个.Net应用程序。在其中一台服务器上,将托管API以从数据库提供敏感数据,然后在另一台服务器上,应用程序将向该API发送请求。在存储向API发送请求的应用程序的网络中,想法是拥有一个身份验证项目,该项目将对应用程序用户进行身份验证,并为他们提供oAuth Token,可用于查询其他网络上的API。

当请求到达API时,我想做的就是有一种方法来检查它们是否已被授权并且是真实的。

我认为为了确保请求是真实的,我可以为两个应用程序提供相同的oAuth加密密钥,然后API可以尝试解密令牌,如果成功,它是一个受信任的请求,因为它是用相同的密钥加密的。

我不确定这是否是一种检查身份验证的安全方法,并且想知道这是否是一个好主意。

c# .net api oauth access-token
2个回答
0
投票

您所描述的内容似乎更像是一个简单的基于令牌的身份验证系统,而不是完整的OAuth授权框架。顾名思义,OAuth更多的是授予代表您行动的应用授权。

OAuth:授权的开放标准。开发始于2006年,因为来自Twitter和Google等公司的员工认为需要一套共享协议,规定Web服务应如何授权其他Web应用访问其用户信息。

(重点是我的,来源:Auth0 Identity Glossary

不要误会我的意思,你可以通过完整的OAuth来完成你想要的东西,但对于这个用例,似乎没有必要。您可以通过使用JWT作为令牌格式实现基于令牌的身份验证系统来实现相同目的;这有几个好处:

  • 它比完全理解OAuth并实现您自己的兼容授权服务器更简单。即使您选择部署开源替代方案,您仍然需要确保一切安全或禁用您不需要的所有内容。 (我已经经历过这种经历,除非我有足够的时间和资源去做,否则我不会再这样做了)
  • 您的API已经接受JWT令牌作为身份验证,因此如果将来您确实需要使用完整的OAuth,那么您的API已经做好了准备。

使用JWT,执行身份验证的应用程序与使用令牌的API之间的信任关系是通过JWT可以签名(使用对称密钥,这似乎是您的用例,或使用非对称密钥)来确保的,以确保除了密钥持有者之外,没有人可以生成此有效令牌。 JWT还支持加密,但签名足以建立信任关系,如果您在令牌本身中有敏感信息并希望保护其免受窃听,您只需要将混合加密。

在.NET中,您应该能够依靠以下Nuget包System.IdentityModel.Tokens.Jwt开始创建和验证使用对称密钥签名的JWT令牌。


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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.