Как настроить JWT STS без IdentityServer или OAuth - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу создать службу токенов безопасности JWT (.net core 2+) для обеспечения аутентификации и авторизации для многих API (.net core 2+) без использования IdentityServer или OAuth, потому что я хочу без перенаправлений .

Следующая схема описывает сценарий:

diagram

"Аутентификатор JWT" работает нормально и имеет маршруты

  • POST-аккаунт: зарегистрировать нового пользователя
  • POST Auth / Login: вернуть токен jwt, если учетные данные действительны
  • POST-токен: обновить токен
  • POST-токен / отменить: отозватьtoken

Однако я изо всех сил пытаюсь предоставить шаги 4 и 5. Я попробовал много вариантов в API1 / Startup.cs -> ConfigureServices и не смог получить никаких результатов, кроме 404 при вызове GET API1/Ресурс.Метод ConfigureServices по-прежнему таков:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        })
       .AddJwtBearer(options =>
       {
           options.Authority = "http://localhost:6000"; // JWT Authenticator address
           options.RequireHttpsMetadata = false;
           options.SaveToken = true;
           options.TokenValidationParameters = new TokenValidationParameters
           {    
               ValidIssuer = _configuration.GetValue<string>("JwtIssuer"),
               ValidAudience = _configuration.GetValue<string>("JwtAudience"),
               IssuerSigningKey = new SymmetricSecurityKey(
                   Encoding.UTF8.GetBytes(_configuration.GetValue<string>("JwtSecretKey"))),
               ClockSkew = TimeSpan.Zero
           };
       });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

Возможно ли настроить шаги 4 и 5 с использованием метода, подобного AddJwtBearer?Если нет, что мне делать?Использовать фильтр авторизации для API1 для перехвата запросов и отправки запроса в JWT Authenticator для проверки токена / получения заявок / и т. Д.

1 Ответ

0 голосов
/ 14 апреля 2019

Некоторые мысли ...

Ваши 4 и 5 дорожек; обычно вы не спрашиваете поставщика токена, действителен ли он. Что вы делаете, это проверяете, скорее всего, с помощью подписи, какие параметры можно (необязательно) загрузить у провайдера.

Обратите внимание на тонкую разницу: сам провайдер не проверяет это.

Далее: ClockSkew = TimeSpan.Zero, это очень мало. Я бы, по крайней мере, ослабил это.

И хотя бы; наличие 404 означает, что ресурс не найден. Это не 401 или 403. Это предполагает, что авторизация прошла успешно, но запрошенный ресурс не найден.


Типичная реализация для проверки подписи:

примечание это не решит ваши 404.

options.TokenValidationParameters = new TokenValidationParameters
{
    IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
    {
        // get from provider 
        // todo: cache this
        var json = new WebClient().DownloadString(
             issuer + "/.well-known/jwks.json"); //typical endpoint

        // serialize the result
        var keys = JsonConvert.DeserializeObject<JsonWebKeySet>(json).Keys;
        // cast the result to be the type expected by IssuerSigningKeyResolver
        return (IEnumerable<SecurityKey>) keys;
    }
//...
...