在 .Net Framework 遗留应用程序中使用 Session cookie and/or JWT Bearer Token 进行身份验证

Authentication using both Session cookies and/or JWT Bearer Token in .Net Framework Legacy Appliction

我目前正在使用微服务将现有的 ASP.NET MVC 单体应用程序迁移到 .NET Core。此迁移的一部分现在涉及将 Identity Server 4 与外部身份提供者一起使用。迁移正在使用 strangler pattern,因为我们正在慢慢迁移旧系统,而不是一次完成整个迁移。因此,我们必须支持使用基于 cookie session 身份验证的遗留系统以及使用 JWT 承载令牌的新微服务 api。

目前我正在探索支持这两种身份验证的最简单方法,直到迁移 100% 完成。 Web 应用程序很好,因为它仍然使用剃刀页面和服务器端身份验证,因此可以轻松地建立 session,并传回我的令牌以进行 api 身份验证。我的移动客户端是问题所在,它是使用 ionic 和以前使用的服务器端 session 身份验证构建的(在我的时间之前..)。现在,我将 OpenID Connect 协议与外部 ISP 一起使用,我的所有身份验证流程都在移动客户端上处理,因此未创建 session。

选项 1: 严格使用我的 JWT 承载令牌在我的移动应用程序上进行身份验证,并以某种方式配置我的 MVC 控制器以能够使用 JWT 身份验证(如果它存在于 header 中)或 Cookie 身份验证(如果请求中存在 cookie(旧版)网络应用程序)。我不确定我是否需要创建自定义中间件来完成此操作,或者是否有一种方法可以在启动时配置某些内容而无需创建中间件,并且控制器 [authorize] 属性只会知道使用 cookie 或 bearer auth。我发现一篇文章解释说这在 Core 上是可能的,但还没有找到与 .NET 框架相关的任何内容。

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
           //configuration goes here
        });

        app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
        {
           //configuration goes here    
        }

选项 2: 在我的遗留应用程序服务器中创建一个新端点,并让我的移动客户端将我收到的不记名令牌传递给端点以建立 session。现在我的移动客户端可以在每个请求中传递 cookie 和持有者 JWT 令牌,并让服务器决定它想要如何验证。这显然增加了一些复杂性,因为现在我正在维护 cookie 和令牌过期等,但这只会在迁移结束之前发生。

选项 3: ???

问题: 我花了很多时间研究这两个选项的有效性,并且大多只获得与 .NET 核心相关的资源,但很少有关于 .NET Framework 的资源。我只需要在短时间内支持遗留应用程序,所以此时我正在寻找最简单的解决方案而不是最干净的解决方案。想知道是否有做过类似迁移的人可以提供解决方案或了解他们是如何完成这项工作的?

我最近做了类似的事情,我在同一个项目中有 API 控制器和 MVC 控制器。 API 控制器使用 JWT 进行身份验证,MVC 控制器使用 Cookie 身份验证。

这可能不会直接转化为您的问题,但希望对您有所帮助...

Startup.Auth 的设置与您在选项 1 中的设置类似。

在您的配置中 类 您可以使用过滤器来 select 要使用的身份验证类型:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        //Tells APIs to ignore the Default Cookie Type Authentication
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

    }
}    

重要的部分是 config.SuppressDefaultHostAuthentication();config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

这里剩下的部分是实际构建令牌然后使用它。

Helpful material for using JWT with Identity