【问题标题】:oAuth Token Authentication - using same secret keyoAuth 令牌认证 - 使用相同的密钥
【发布时间】:2017-02-12 09:41:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • JWT(Json Web Token)可以作为一个选项
  • 你应该看看this IdentityServer3 是Katan 版本,IdentityServer4 是Core。那里有很多 .net 安全的东西,所以你可能会发现一些有用的东西
  • 谢谢Filip,我去看看!
  • bitoftech.net/2014/06/01/… 我在我的 Angular 项目中使用了这个
  • @Sherlock 谢谢你,我的项目基于这篇文章

标签: c# .net api oauth access-token


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 谢谢你,这是一个绝妙的答案,非常广泛。我研究过 JWT,它似乎非常适合所需的东西,但我唯一担心的是我需要能够撤销令牌。由于 api 将提供敏感数据,因此确实有必要拥有这种控制权,并且根据我所读到的内容,您无法使用 JWT 执行此操作,您可以但需要令牌黑名单。
  • 是的,JWT 最常见的用例是将它们用作自包含令牌(承载),这使得撤销更加复杂。撤销所有已发布的令牌很容易,只需切换签名凭据,但根据具体情况,您总是需要一个黑名单。
【解决方案2】:

要解码字符串令牌,您需要用于生成加密令牌的秘密字符串。 这段代码对我有用:

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;
    }

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多