我目前正在使用微服务迁移现有的ASP.NET MVC单片应用程序到.NET CORE。现在,此迁移的一部分涉及将身份服务器4与外部身份提供商一起使用。迁移正在使用扼杀模式,因为我们正在慢慢迁移旧系统,而不是立即进行整个迁移。因此,我们必须支持使用基于Cookie的会话身份验证以及使用JWT BEARER令牌的新微服务API的旧系统。
目前,我正在探索最简单的方法来支持两种类型的身份验证,直到迁移100%完成为止。Web应用程序很好,因为它仍然使用剃须刀页面和服务器端身份验证,因此可以轻松建立一个会话,并将我的令牌传递给我的API身份验证。我的移动客户端是问题,它是使用离子和先前使用的服务器端会话身份验证(在我的时间之前)构建的。现在,我正在使用外部ISP使用OpenID Connect协议,我的所有身份验证流都在客户端上用于移动设备,因此未创建会话。
选项1:使用严格的JWT携带者令牌在我的移动应用程序上进行身份验证,并以某种方式配置我的MVC控制器,如果在请求中存在cookie(传统Web应用程序)中存在cookie,则可以使用JWT身份验证。我不确定我是否需要创建自定义中间件来完成此操作,或者是否有一种方法可以在不必创建中间件的情况下配置某些东西,而控制器[授权]属性只会知道使用cookie或bearer auth。我发现一篇文章解释说,这在核心上是可能的,但尚未找到与.NET框架有关的任何内容。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
//configuration goes here
});
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
//configuration goes here
}
选项2:在我的旧应用程序服务器中创建一个新的端点,并让我的移动客户端通过我收到的承载令牌到端点以建立会话。现在,我的移动客户端可以在每个请求中传递cookie和携带者JWT令牌,并让服务器决定要如何验证。显然,这增加了一些并发症,因为我现在维护了cookie和doken的到期等,但是只有直到迁移结束为止。
选项3:???
问题:我花了很多时间来研究任何一种选项的有效性,并且大部分仅获得与.NET核心相关的转移,但是在.NET框架上很少。我只需要在短时间内支持旧版申请,因此我在这一点上正在寻找最简单的解决方案,而不是最干净的解决方案。想知道是否有人进行了类似迁移的人可以提供解决方案或有关他们如何实现这一目标的解决方案?
我最近做了类似的事情,在同一项目中我的API控制器和MVC控制器。用JWT认证的API控制器和具有Cookie Authentication的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));
剩下的部分是实际构建令牌然后消耗它。
有助于使用JWT具有身份的材料