使用OWIN从asp.net核心发布的oAuth承载

And*_*riy 2 c# owin asp.net-core

我有带OWIN管道的ASP.NET 4.5服务,该管道发出OAuth access_token以换取用户名/密码。此服务从ng-app中调用,一旦获得令牌,就将其存储在浏览器的本地存储中。然后,它调用消耗此令牌的资源api,API也用asp.net 4.5编写并使用owin。这是与OWIN一起发行的OAuth令牌,已加密/签名到了MachineKey机密中-到目前为止效果很好,并且很高兴被资源API消耗。OAuthAuthorizationServerMiddleware使所有这些成为可能。

现在,我需要使用从同一个ng-app发送到asp.net core 2.1服务的这些令牌,没有什么花哨的地方,只需对其进行验证/解码并获得令牌内部的声明。
这个OAuthAuthorizationServerMiddleware从未移植到asp.net核心,所以我被困住了。( ASP.NET Core中的OAuth授权服务 它没有帮助谈论完整的oidc服务器,我只需要使用它们而不需要更改发行代码即可)在对service.AddAuthentication()进行附加的configureServices()中:Tried.AddJwtBearer-但这没有任何意义-这些不是Jwt令牌真的是Tried.AddOAuth,但这对我来说都不有意义,因为我没有处理带有重定向的完整OAuth流程以获得令牌,我也没有处理ClientId / ClientSecret / etc,我只收到“ ng app的HTTP标头中的Bearer token-here”,因此我需要在管道中进行某些操作以对其进行解码并设置ClaimsIdentity,但是此“管道中的内容”还需要访问与机器相同的类似机器的数据在asp.net 4.5中的OWIN服务有什么想法吗?

Gon*_*nza 5

您可以将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); })
Run Code Online (Sandbox Code Playgroud)

重要的是,Owin在OAuthAuthorizationServerMiddleware中使用相同的DataProtector“用途”,以便正确加密/解密数据。这些是“ Microsoft.Owin.Security.OAuth”,“ Access_Token”和“ v1”。(请参阅/sf/answers/2061837151/)。

最后,您将不得不迁移Owin TicketSerializer(也许还有TicketFormat),因为NetCore中的那个稍有不同。您可以从这里获取:

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

我最近正在工作。基本上对.NET 4.5 Owin API进行身份验证,并使用同一令牌在NET Core中运行资源API。清理后,我将尝试在github中共享代码。

据我所知,不建议保留旧的计算机密钥数据保护器,而应从NET Core迁移到新的计算机。有时这是不可能的。就我而言,我已经在生产中使用了太多的API,因此我正在尝试一些新的NET Core API与旧版API一起使用。

  • 谢谢!关于该主题的文章和答案如此之多,这是第一个承认我可能希望通过重用aspnetcore中的相同机器密钥以便能够通过其现有cookie对某人进行身份验证的用户,从而获得无缝体验。 (2认同)
  • 这是基于daixinkai实现的repo https://github.com/gonzaloluna/AspNetCore.Owin (2认同)

hen*_*olf 5

您应该尝试使用Owin.Token.AspNetCore nuget 包。通过遵循 README 文件中提供的代码示例,我能够使用 .NET Core 3.1 上的机器密钥解码旧令牌。注意:如果默认值不适合您,还有一个选项可以指定加密方法和验证方法。