Authentication 使用多个ServiceStack';s身份验证提供程序引发错误
我打算使用2个ServiceStack的身份验证提供程序:一个基于Authentication 使用多个ServiceStack';s身份验证提供程序引发错误,authentication,servicestack,Authentication,servicestack,我打算使用2个ServiceStack的身份验证提供程序:一个基于CredentialAuthProvider的自定义提供程序,称为remotecreds,以及内置的JwtAuthProvider。我的AppHost注册码如下所示 appHost.Plugins.Add(新建AuthFeature(()=>new UserSession(), 新IAuthProvider[] { 新JwtAuthProvider(AppSettings) { RequireSecureConnection=fa
CredentialAuthProvider
的自定义提供程序,称为remotecreds
,以及内置的JwtAuthProvider
。我的AppHost注册码如下所示
appHost.Plugins.Add(新建AuthFeature(()=>new UserSession(),
新IAuthProvider[]
{
新JwtAuthProvider(AppSettings)
{
RequireSecureConnection=false,
HashAlgorithm=“RS256”,
PublicKeyXml=PublicKeyXml,
访问群体=新列表{$“{AppSettings.GetDictionary(“Auth”)[“Url”]}/resources},
PopulateSessionFilter=PopulateSessionFilter
},
新的RemoteCredentialAuthProvider(应用设置)
{
PopulateSessionFilter=PopulateSessionFilter
},
}));
当我使用自定义身份验证提供程序(POST/auth/remotecreds
)进行身份验证时,ServiceStack返回以下错误,尽管身份验证提供程序的代码已正确执行
{
"responseStatus": {
"errorCode": "NotSupportedException",
"message": "PrivateKey required to use: RS256",
"stackTrace": "[Authenticate: 25/04/2019 9:59:25 AM]:\n[REQUEST: {provider:remotecreds,userName:admin,password:Pa$$word123}]\nSystem.NotSupportedException: PrivateKey required to use: RS256\r\n at ServiceStack.Auth.JwtAuthProvider.GetHashAlgorithm(IRequest req) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\JwtAuthProvider.cs:line 87\r\n at ServiceStack.Auth.JwtAuthProvider.CreateJwtBearerToken(IRequest req, IAuthSession session, IEnumerable`1 roles, IEnumerable`1 perms) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\JwtAuthProvider.cs:line 118\r\n at ServiceStack.Auth.JwtAuthProvider.Execute(AuthFilterContext authContext) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\JwtAuthProvider.cs:line 57\r\n at ServiceStack.Auth.AuthenticateService.Post(Authenticate request) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\AuthenticateService.cs:line 253\r\n at ServiceStack.Host.ServiceRunner`1.ExecuteAsync(IRequest req, Object instance, TRequest requestDto) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Host\\ServiceRunner.cs:line 133",
"errors": []
}
}
如果我注释掉AppHost中的JwtAuthProvider
注册,上面的相同调用将成功
因此,在这里我感到困惑,为什么ServiceStack调用
JwtAuthProvider
,而我明确针对我的自定义身份验证提供程序进行身份验证。问题是您的JwtAuthProvider
配置错误,如果您想使用RSA*
哈希算法,它需要:
它仍将尝试向您的自定义AuthProvider进行身份验证,但如果您注册了JwtAuthProvider
,则它将尝试使用来填充AuthenticateResponse
,因此当用户针对您的身份验证提供程序进行身份验证时,例如:
var clientnew JsonServiceClient(baseUrl);
var authResponse = client.Post(new Authenticate {
provider = "remotecreds",
UserName = username,
Password = password,
RememberMe = true,
});
他们将有权访问在以下位置填充的JWT令牌:
var jwt = authResponse.BearerToken;
因此,如果配置正确,它将在BearerToken
或
如果删除
JwtAuthProvider
它将不会尝试填充它 谢谢你,真管用!然而,我也发现在我的用例中应该使用JwtAuthProviderReader
。本质上,我有一个单独的身份服务器,我只想在服务堆栈中验证该服务器发出的JWT令牌。如果我使用请求过滤器手动验证,我将无法利用[Authenticate]
等功能。如果我使用JwtAuthProvider
,那么服务堆栈将需要Identity Server的私钥,这是不合理的JwtAuthProviderReader
验证令牌,将其映射到会话,并且不在自定义身份验证流中生成令牌
var jwt = authResponse.BearerToken;