servicestack,Authentication,servicestack" /> servicestack,Authentication,servicestack" />

Authentication 使用多个ServiceStack';s身份验证提供程序引发错误

Authentication 使用多个ServiceStack';s身份验证提供程序引发错误,authentication,servicestack,Authentication,servicestack,我打算使用2个ServiceStack的身份验证提供程序:一个基于CredentialAuthProvider的自定义提供程序,称为remotecreds,以及内置的JwtAuthProvider。我的AppHost注册码如下所示 appHost.Plugins.Add(新建AuthFeature(()=>new UserSession(), 新IAuthProvider[] { 新JwtAuthProvider(AppSettings) { RequireSecureConnection=fa

我打算使用2个ServiceStack的身份验证提供程序:一个基于
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;