Перенос JWT-аутентификации без сохранения состояния с Nancy 1.4.5 на 2.0.0 - PullRequest
0 голосов
/ 10 мая 2019

Я реализовал аутентификацию JWT без сохранения состояния в Nancy 1.4.5, и она работала нормально. Портируя мой проект на Nancy 2.0.0, механизм аутентификации больше не работает.

В методе ApplicationStartup загрузчика у меня есть:

    protected override void ApplicationStartup(IKernel container, IPipelines pipelines)
    {
        #region JWT authentication
        // JWT stateless authentication, see: https://foreverframe.net/nancy-meets-jwt-authentication/
        var secretKey = LocalConstants.Authorization.SecretKey;
        string cryptografyAlgorithm = LocalConstants.Authorization.CryptografyAlgorithm;
        string bearerDeclaration = LocalConstants.Authorization.HttpHeaderBearerDeclaration;
        var identityProvider = new IdentityProvider(secretKey, cryptografyAlgorithm, bearerDeclaration);
        var statelessAuthConfig = new StatelessAuthenticationConfiguration(identityProvider.GetUserIdentity);
        StatelessAuthentication.Enable(pipelines, statelessAuthConfig);
        #endregion
        ...

Во время выполнения клиенты могут выполнить вход в систему и правильно получить JWT. Они сохраняют JWT в заголовке HTTP в последующих запросах. Когда последующие запросы достигают сервера, метод GetUserIdentity моего identityProvider считывает JWT и правильно возвращает действительный ClaimsPrincipals.

В моем модуле

 this.RequiresAuthentication();

, однако, возникает исключение Nancy.ErrorHandling.RouteExecutionEarlyExitException с причиной «Требуется аутентификация», причиной «Требуется аутентификация» и ответом «Несанкционированный текст / html» с кодом состояния Nancy.HttpStatusCode.Unauthorized.

Как правильно перенести проверку подлинности без сохранения состояния на Nancy 2.0.0?

1 Ответ

0 голосов
/ 10 мая 2019

Сам нашел решение: проблема не в конфигурации, а в способе использования JWT на сервере. Функция, передаваемая в качестве аргумента объекту StatelessAuthenticationConfiguration (в моем примере identityProvider.GetUserIdentity) должна возвращать ClaimsIdentity, идентификационная информация которой аутентифицирована.

Для этого передайте непустую непустую строку в качестве параметра authenticationType, например, здесь:

ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "CustomAuthenticationType");

В моей предыдущей попытке я только что передал утверждения, в результате чего для свойства1.Identity его свойство IsAuthenticated оценивалось как False.

...