在.Net Framework传统应用程序中使用会话cookie和/或JWT承载令牌进行身份验证

时间:2019-02-28 17:54:39

标签: asp.net-mvc oauth-2.0 asp.net-identity identityserver4 openid-connect

我目前正在使用微服务将现有的ASP.NET MVC Monolithic应用程序迁移到.NET Core。现在,此迁移的一部分涉及将Identity Server 4与外部身份提供程序一起使用。迁移使用strangler pattern是因为我们正在缓慢地迁移出旧系统,而不是立即进行整个迁移。因此,我们必须支持使用基于cookie的会话身份验证的旧系统以及使用JWT承载令牌的新微服务api。

当前,我正在探索最简单的方法来支持两种身份验证,直到迁移完成100%。该Web应用程序还不错,因为它仍然使用剃须刀页面和服务器端身份验证,因此可以轻松地建立会话,以及将我的令牌回传给api身份验证。我的移动客户端是问题所在,它是使用ionic和以前使用的服务器端会话身份验证(在我之前)建立的。现在,我将OpenID Connect协议与外部ISP一起使用,我的所有身份验证流程都是在移动客户端上处理的,因此不会创建会话。

选项1: 严格使用我的JWT承载令牌在我的移动应用程序上进行身份验证,并以某种方式将我的MVC控制器配置为能够使用JWT身份验证(如果标头中存在JWT身份验证)或Cookie身份验证(如果请求中存在Cookie)(旧版网络应用程序)。我不确定是否需要创建自定义中间件来完成此任务,还是不确定是否可以在启动时配置一些东西而无需创建中间件,并且controllers [authorize]属性将只知道使用cookie或承载认证。我找到了一篇文章,解释说这可以在Core上实现,但尚未找到与.NET Framework相关的任何内容。

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

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

选项2: 在旧版应用程序服务器中创建一个新端点,并使我的移动客户端将我收到的承载令牌传递给端点以建立会话。现在,我的移动客户端可以在每个请求中传递cookie和承载JWT令牌,并让服务器决定其验证方式。显然,这增加了一点复杂性,因为现在我正在维护cookie和令牌到期等,但是直到迁移结束为止。

选项3: ???

问题: 我花了很多时间研究这两个选项的有效性,并且大多只是获得与.NET核心相关的资源,但是在.NET Framework上却很少。我只需要在短时间内支持旧版应用程序,因此我目前在寻找最简单的解决方案,而不是最干净的解决方案。想知道进行类似迁移的任何人是否可以提供解决方案或对他们如何实现此目标的理解?

1 个答案:

答案 0 :(得分:1)

最近我做了类似的事情,在同一项目中有API控制器和MVC控制器。通过JWT认证的API控制器和通过Cookie认证的MVC控制器。

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

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

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

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