потребляет oAuth-носитель, выданный OWIN из ядра asp.net - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть служба ASP.NET 4.5 с конвейером OWIN, который выдает OAuth access_token в обмен на имя пользователя / пароль.Эта служба вызывается из ng-app и после получения токена сохраняет в локальном хранилище браузера.Затем он вызывает ресурс API, который использует этот токен, API также написан на asp.net 4.5 и использует owin.Этот токен OAuth, выданный вместе с OWIN, зашифрован / подписан с использованием секретов machineKey - пока что он хорош и успешно используется ресурсным API.Все это стало возможным благодаря OAuthAuthorizationServerMiddleware.

Теперь мне нужно использовать эти токены, отправленные из одного и того же ng-приложения в службы asp.net core 2.1, ничего особенного, просто проверьте / декодируйте его и получите утверждения внутри токена.
Это OAuthAuthorizationServerMiddleware никогда не было портировано на ядро ​​asp.net, поэтому я застрял.( Служба авторизации OAuth в ASP.NET Core не помогает ему рассказывать о полноценном oidc-сервере, мне просто нужно использовать их без изменения кода выдачи) В ConfigureServices () привязано к сервису.AddAuthentication (): Tried.AddJwtBearer - но это не имеет смысла - на самом деле это не токены Jwt Tried.AddOAuth, но это не имеет смысла, т.к. я не имею дело с полным потоком OAuth с перенаправлениями для получения токена, я такжене работайте с ClientId / ClientSecret / etc, я просто получаю «Bearer token-here» в заголовке HTTP от приложения ng, поэтому мне нужно что-то в конвейере, чтобы декодировать это и установить ClaimsIdentity, но это «что-то в конвейере» также необходимоиметь доступ к машиноподобным данным, которые совпадают с данными в сервисе asp.net 4.5 OWIN. Есть идеи?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете настроить OAuthValidation AccessTokenFormat на использование MachineKey DataProtectionProvider и DataProtector, которые будут защищать и снимать защиту с токенов вашего носителя.Вам нужно будет реализовать MachineKey DataProtector.Этот парень уже сделал это https://github.com/daixinkai/AspNetCore.Owin/blob/master/src/DataProtection/src/AspNetCore.DataProtection.MachineKey/MachineKeyDataProtectionProvider.cs.

public void ConfigureServices(IServiceCollection services){
   services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
   ConfigureAuth(services);

  string machineKey = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
        <machineKey decryption=""Auto"" decryptionKey =""DEC_KEY"" validation=""HMACSHA256"" validationKey=""VAL_KEY"" />";
        var machineKeyConfig = new XmlMachineKeyConfig(machineKey);
        MachineKeyDataProtectionOptions machinekeyOptions = new MachineKeyDataProtectionOptions();
        machinekeyOptions.MachineKey = new MachineKey(machineKeyConfig);
        MachineKeyDataProtectionProvider machineKeyDataProtectionProvider = new MachineKeyDataProtectionProvider(machinekeyOptions);
        MachineKeyDataProtector machineKeyDataProtector = new MachineKeyDataProtector(machinekeyOptions.MachineKey);

   //purposes from owin middleware
   IDataProtector dataProtector = 
   machineKeyDataProtector.CreateProtector("Microsoft.Owin.Security.OAuth",
               "Access_Token", "v1"); 

   services.AddAuthentication(options =>
   {
       options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
   })
   .AddOAuthValidation(option=> {
            option.AccessTokenFormat = new OwinTicketDataFormat(new OwinTicketSerializer(), dataProtector); })

Важно сохранить те же «цели» DataProtector, которые Оуэн использует в OAuthAuthorizationServerMiddleware, чтобы данные были правильно зашифрованы / расшифрованы.Это «Microsoft.Owin.Security.OAuth», «Access_Token» и «v1».(см. https://stackoverflow.com/a/29454816/2734166).

И, наконец, вам нужно будет перенести Owin TicketSerializer (и, возможно, также TicketFormat), поскольку тот, что в NetCore, немного отличается. Вы можете взять его отсюда:

https://github.com/aspnet/AspNetKatana/blob/e2b18ec84ceab7ffa29d80d89429c9988ab40144/src/Microsoft.Owin.Security/DataHandler/Serializer/TicketSerializer.cs

Я недавно заработал на этом. По сути, проверка подлинности с помощью API-интерфейса Owin .NET 4.5 и запуск API ресурсов в NET Core с использованием того же токена. Я попытаюсь поделиться кодом в github.как только я его почистил.

Насколько я знаю, не рекомендуется сохранять старый ключ защиты данных машинного ключа, но переходить на новый из NET Core. Иногда это невозможно.В случае, если у меня уже слишком много API, я пытаюсь использовать несколько новых API-интерфейсов NET Core для работы с устаревшими.

...