Использование нескольких провайдеров аутентификации ServiceStack выдает ошибку - PullRequest
1 голос
/ 25 апреля 2019

Я намереваюсь использовать 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": []
    }
}

Если я закомментирую регистрацию JwtAuthProvider в AppHost, такой же вызов выше будет успешным.

Так что здесь я запутался, почему ServiceStack вызывает JwtAuthProvider, в то время как я явно прошел проверку подлинности на моем провайдере аутентификации.

1 Ответ

1 голос
/ 25 апреля 2019

Проблема в том, что ваш JwtAuthProvider настроен неправильно, если вы хотите использовать алгоритм хеширования RSA*, он должен быть сконфигурирован с использованием закрытого ключа :

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

Он по-прежнему будет пытаться аутентифицироваться с вашим Custom AuthProvider, но если вы зарегистрировали JwtAuthProvider, он будет пытаться заполнить AuthenticateResponse токеном JWT в BearerToken , поэтому, когда пользователи аутентифицируются против вашего провайдера аутентификации, например:

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, он не будет пытаться заполнить его.

...