用于发布和验证JWT的自定义令牌服务

时间:2018-12-07 13:21:21

标签: c# asp.net-core jwt

我们需要开发“单点登录”服务(SSO),以向大量客户发布JWT。这些客户端的开发人员还将需要具有验证这些令牌的能力。显然,我们无法为他们提供用于生成这些令牌的密钥。因此,我们决定为他们提供两种方法的API服务。一个用于发行令牌,第二个用于验证令牌。

我在问自己是否要采用正确的方法。这是一个基本方案,显示用户如何与他们的客户端(安全应用程序)一起工作

Fig. 1 - Basic scheme of users interactions

用户通过我们的服务使用其凭据登录并获取他的访问令牌。 然后,他的令牌将用于安全应用程序的请求标头中。 SSO客户端模块是AuthenticationHandler,它将HTTP请求发送到我们的服务以检查令牌的有效性。

以下是我们用于验证令牌的SSO客户端模块中的一些代码。我们使用自定义身份验证处理程序,该处理程序将调用远程SSO服务:

internal class SsoAuthenticationHandler : AuthenticationHandler<SsoAuthenticationOptions>
{
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        if (!TryRetrieveToken(Request, out var token))
        {
            return AuthenticateResult.NoResult();
        }

        if (await _ssoClient.ValidateTokenAsync(token))
        {
            return AuthenticateResult.Success(...);
        }

        return AuthenticateResult.NoResult();
    }
}

和SsoClient iself:

public class SsoClient
{
    public async Task<bool> ValidateTokenAsync(string token)
    {
        const string validateUrl = "api/auth/validatetoken";

        var address = $"https://{_ssoHost}/{validateUrl}";
        using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
            var res = await httpClient.GetStringAsync(new Uri(address));
            reply = DeserializeSsoReply(res);
        }

        return reply.Succeeded;
    }
}

我找不到适合我们情况的最佳实践,所以我想知道这种方法是否可能遇到陷阱?

1 个答案:

答案 0 :(得分:0)

当我们遇到类似的情况时,我们为每个有效的客户端执行的操作是获得证书,他们可以使用该证书为目标(也称为我们)服务创建JWT。在验证其来源之后,将使用我们与他们共享的证书对他们的凭据进行重新打包和签名。对于有限数量的有效呼叫者,这有助于我们跟踪真实的来源(基于签名证书)以及标准化的有效载荷供我们使用。

收到邮件后,我们将验证观众(也就是我们)的正确性,并且签名者是已配置的签名者之一。

每个人都保守自己的秘密,任何想相信自己的人都提供了公共密钥。密钥的所有者(也就是您)始终控制着您的秘密,但是每个人都必须就端到端协议达成共识。

我不认为这种重塑只是保护流行路径并限制进入一组已知用户。