在 RESTful Web API 中验证后续请求的令牌签名

Posted

技术标签:

【中文标题】在 RESTful Web API 中验证后续请求的令牌签名【英文标题】:Validate a token signature for subsequent request in a restful web api 【发布时间】:2014-03-05 03:38:54 【问题描述】:

当用户通过身份验证时,我在响应授权标头中放置了一个签名令牌。

只有使用有效的签名令牌才允许对资源 URL 的每次进一步访问。

当我创建令牌并验证它时:

var principal = tokenHandler.ValidateToken(tokenString, validationParameters);

然后当签名密钥与得到的密钥相同时,我得到委托人(发出请求的用户)

用于创建令牌。

我可以在身份验证后和资源请求期间使用相同的签名密钥来验证我创建的这个类的令牌:

public static class ApiConstants

    private static readonly RNGCryptoServiceProvider CryptoProvider = new RNGCryptoServiceProvider(new byte[33]);
    private static byte[] key = new byte[32];

    static ApiConstants()
    
        CryptoProvider.GetBytes(key);
    

    public static byte[] GetSignedKey()
    
        return key;
    

我将这段代码放在一个静态类中是否有什么问题,这实际上是我的全部目的,因为我希望用随机数填充字节数组只发生一次!?

还有什么可以改进的吗?

【问题讨论】:

【参考方案1】:

您不能将签名令牌设为静态。因为那样它将成为全局变量并由所有请求(线程)共享。您还将面临静态字段的并发问题。

如果你想让它特定于会话。那么您需要存储在会话变量中而不是静态字段中。

【讨论】:

问题是创建令牌和验证令牌的时间不在 ONE 请求中,所以 validateToken 如果不是静态的,如何使用创建令牌时使用的相同密钥?我没有在服务器端使用会话/cookie,因为我在我的 http api 中遵循 REST 原则。 也许我必须将密钥生成放在一个接口中,并通过 autoface 将其注入 .SingleInstance 这是一个共享单例?! 如果生成的令牌可以共享给所有请求,则可以将类设为静态。我的意思是说它将为所有用户/请求一次性生成令牌。 @HelloWorld 使用字典存储你的令牌然后从那里验证怎么样。

以上是关于在 RESTful Web API 中验证后续请求的令牌签名的主要内容,如果未能解决你的问题,请参考以下文章

web api - asp.net 身份令牌即使对于后续请求也会过期

外部身份验证提供程序和对 RESTful API 的请求的身份验证

ASP.net Web API RESTful Web 服务 + 基本身份验证

来自 RESTful API 的发布请求给出 UnhandledPromiseRejectionWarning:ValidationError:产品验证失败:错误

laravel restful api 与 Auth

如何为 Spring Boot RESTful Web 服务配置多级身份验证?