首页 > 解决方案 > 使用多个 ServiceStack 的身份验证提供程序会引发错误

问题描述

我打算使用 2 个 ServiceStack 的身份验证提供程序:一个基于CredentialsAuthProvider调用remotecreds的自定义提供程序和内置的JwtAuthProvider. 我的 AppHost 注册码如下所示

appHost.Plugins.Add(new AuthFeature(() => new UserSession(),
                new IAuthProvider[]
                {
                    new JwtAuthProvider(AppSettings)
                    {
                        RequireSecureConnection = false,
                        HashAlgorithm = "RS256",
                        PublicKeyXml = publicKeyXml,
                        Audiences = new List<string> { $"{AppSettings.GetDictionary("Auth")["Url"]}/resources" },
                        PopulateSessionFilter = PopulateSessionFilter
                    },
                    new RemoteCredentialsAuthProvider(AppSettings)
                    {
                        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": []
    }
}

如果我注释掉JwtAuthProviderAppHost 中的注册,则上面的相同调用会成功。

所以在这里我很困惑为什么JwtAuthProvider在我明确地对我的自定义身份验证提供程序进行身份验证时调用 ServiceStack。

标签: authenticationservicestack

解决方案


问题是您JwtAuthProvider的配置错误,如果您想使用RSA*哈希算法,则需要使用私钥对其进行配置

new JwtAuthProvider(AppSettings) { 
    HashAlgorithm = "RS256",
    PrivateKeyXml = AppSettings.GetString("PrivateKeyXml") 
}

它仍然会尝试使用您的自定义 AuthProvider 进行身份验证,但如果您已JwtAuthProvider注册,它将尝试使用 BearerTokenAuthenticateResponse中的JWT 令牌填充,因此当用户针对您的身份验证提供者进行身份验证时,例如:

var clientnew JsonServiceClient(baseUrl);

var authResponse = client.Post(new Authenticate {
    provider = "remotecreds",
    UserName = username,
    Password = password,
    RememberMe = true,
});

他们将有权访问填充在以下位置的 JWT 令牌:

var jwt = authResponse.BearerToken;

因此,如果配置正确,它将返回一个填充的 JWT 令牌,BearerToken或者如果您删除JwtAuthProvider它,它不会尝试填充它。


推荐阅读