我们需要开发“单点登录”服务(SSO),以向大量客户发布JWT。这些客户端的开发人员还将需要具有验证这些令牌的能力。显然,我们无法为他们提供用于生成这些令牌的密钥。因此,我们决定为他们提供两种方法的API服务。一个用于发行令牌,第二个用于验证令牌。
我在问自己是否要采用正确的方法。这是一个基本方案,显示用户如何与他们的客户端(安全应用程序)一起工作
用户通过我们的服务使用其凭据登录并获取他的访问令牌。 然后,他的令牌将用于安全应用程序的请求标头中。 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;
}
}
我找不到适合我们情况的最佳实践,所以我想知道这种方法是否可能遇到陷阱?
答案 0 :(得分:0)
当我们遇到类似的情况时,我们为每个有效的客户端执行的操作是获得证书,他们可以使用该证书为目标(也称为我们)服务创建JWT。在验证其来源之后,将使用我们与他们共享的证书对他们的凭据进行重新打包和签名。对于有限数量的有效呼叫者,这有助于我们跟踪真实的来源(基于签名证书)以及标准化的有效载荷供我们使用。
收到邮件后,我们将验证观众(也就是我们)的正确性,并且签名者是已配置的签名者之一。
每个人都保守自己的秘密,任何想相信自己的人都提供了公共密钥。密钥的所有者(也就是您)始终控制着您的秘密,但是每个人都必须就端到端协议达成共识。
我不认为这种重塑只是保护流行路径并限制进入一组已知用户。