Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# oAuth令牌身份验证-使用相同的密钥_C#_.net_Api_Oauth_Access Token - Fatal编程技术网

C# oAuth令牌身份验证-使用相同的密钥

C# oAuth令牌身份验证-使用相同的密钥,c#,.net,api,oauth,access-token,C#,.net,Api,Oauth,Access Token,我目前希望两个.Net应用程序在不同网络中的不同服务器上运行。在其中一台服务器上,将托管一个API以提供来自数据库的敏感数据,然后在另一台服务器上,应用程序将向该API发送请求。在存储向API发送请求的应用程序的网络中,想法是有一个身份验证项目,该项目将对应用程序用户进行身份验证,并向他们提供一个oAuth令牌,该令牌可用于在另一个网络上查询API 当请求到达API时,我想做的就是有一种方法来检查它们是否已被授权并且是真实的 我认为,为了确保请求是真实的,我可以为两个应用程序提供相同的oAuth

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

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

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


我不确定这是否是一种检查身份验证的安全方法,我想了解一下这是否是一个好主意。

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

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

(重点是我的,资料来源:)

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

  • 这比完全理解OAuth并实现自己的兼容授权服务器更简单。即使您选择部署开源替代方案,您仍然需要确保所有内容都是安全的,或者禁用所有不需要的内容。(我已经经历过这样的经历,除非我有足够的时间和资源去做,否则我不会再做)
  • 您的API将已经接受JWT令牌作为身份验证,因此如果将来您确实发现需要使用完整的OAuth,那么您的API已经准备好了
使用JWT,执行身份验证的应用程序和使用令牌的API之间的信任关系是通过以下事实建立的:JWT可以被签名(使用对称密钥,这似乎是您的用例,或者使用非对称密钥),以确保除了密钥持有者之外,没有人可以生成此有效令牌。JWT也支持加密,但签名足以建立信任关系,如果令牌本身中有敏感信息,并且希望保护它不被窃听,则只需将加密带到混合中


在.NET中,您应该能够依靠以下Nuget包开始创建和验证使用对称密钥签名的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;
    }

JWT(Json Web令牌)可以是一个选项。您应该看看IdentityServer 3是Katan版本,IdentityServer 4是核心。那里有很多.net安全方面的东西,所以你可能会发现一些有用的东西。谢谢你,菲利普,我来看看!我把这个用在我的角上project@Sherlock谢谢,我是基于这篇文章的我的项目谢谢,这是一个精彩的回答,非常广泛。我已经研究过JWT,它似乎非常适合需要的东西,但我唯一关心的是我需要撤销令牌的能力。由于api将提供敏感数据,因此有必要进行控制,根据我所了解的情况,您无法使用JWT执行此操作,您可以,但需要一个令牌黑名单。是的,JWT最常见的用例是将其用作自包含令牌(承载),这使得撤销更加复杂。撤销所有已颁发的令牌很容易,只需切换签名凭据即可,但根据具体情况,您始终需要一个黑名单。