我对ServiceStack很陌生,并使用它来提供一个端点来接收来自远程服务的传入请求。不涉及最终用户。
身份验证流程如下(由远程服务的作者指定):
ServiceStack是否支持此身份验证流?
我认为我需要编写连接到请求身份验证并执行上面步骤2-5的代码。是那么回事吗?
编辑:,我找到了看起来是我想要的这个答案,即用上面的步骤2-5覆盖PreAuthenticate的自定义AuthProvider。
using System;
using ServiceStack;
using ServiceStack.Auth;
using ServiceStack.Web;
namespace MyService
{
public class CustomJwtAuthProvider : AuthProvider, IAuthWithRequest
{
public CustomJwtAuthProvider ()
{
Provider = "CustomJwtAuthProvider";
AuthRealm = "/auth/CustomJwtAuthProvider";
}
public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null)
{
return session.IsAuthenticated;
}
public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
{
throw new NotImplementedException("Authenticate() should not be called directly");
}
public void PreAuthenticate(IRequest req, IResponse res)
{
// Get kid from JWT
// Get public JWK from oauth endpoint
// Verify JWT signature using JWK
if ( /* JWT sig verified */ )
{
req.Items[Keywords.Session] = new AuthUserSession
{
IsAuthenticated = true,
};
}
}
}
}然后在ApplicationHost.Configure()中:
Plugins.Add(new AuthFeature(() => new AuthUserSession(),
new IAuthProvider[] {
new CustomJwtAuthProvider(),
}));这种方法似乎正确吗?我需要手动提交JWT身份验证,还是可以更多地利用ServiceStack内置的特性和插件?
发布于 2019-09-03 16:34:01
为了让他们能够向您发送一个ServiceStack接受的经过身份验证的请求的JWT,如果他们使用HMAC-SHA*算法,则您的应用程序需要配置他们的AES密钥,如果他们是使用JWE,则需要配置他们的公钥。
这个流程非常奇怪,对于他们能够向您发送一个定制的JWT密钥--他们需要能够创建自己的JWT密钥--这意味着他们需要您的应用程序配置的AES或私密RSA密钥,而它们将是您唯一能够通过应用程序JWT进行身份验证的密钥?
您不太可能想用远程服务来配置您的应用程序,而应该使用像JWT NuGet软件包这样的JWT库来验证它们发送给您的JWT,然后提取出它们的端点,并使用.NET库(如JWK )来验证它们发送给您的JWK。
注意,这个流程独立于ServiceStack的JWT支持,您可以使用它通过JWT对您的服务启用无状态身份验证。在这里,您只需使用JWT和JWK库来验证它们的密钥并从它们中提取所需的信息。
https://stackoverflow.com/questions/57775048
复制相似问题