Jos*_*h L 5 asp.net-mvc oauth-2.0 asp.net-identity openid-connect identityserver4
我目前正在使用微服务将现有的 ASP.NET MVC Monolithic 应用程序迁移到 .NET Core。现在,此迁移的一部分涉及将 Identity Server 4 与外部身份提供商结合使用。迁移使用的是扼杀者模式,因为我们正在慢慢地迁移出旧系统,而不是立即完成整个迁移。因此,我们必须支持使用基于 cookie 的会话身份验证的遗留系统以及使用 JWT 不记名令牌的新微服务 api。
目前我正在探索支持两种类型身份验证的最简单方法,直到迁移 100% 完成。Web 应用程序很好,因为它仍然使用 razor 页面和服务器端身份验证,因此可以轻松建立会话,并传回我的令牌以进行 api 身份验证。我的移动客户端是问题所在,它是使用离子和以前使用的服务器端会话身份验证构建的(在我之前......)。现在,我将 OpenID Connect 协议与外部 ISP 一起使用,我的所有身份验证流程都在移动客户端上处理,因此不会创建会话。
选项 1: 严格使用我的 JWT 持有者令牌在我的移动应用程序上进行身份验证,并以某种方式配置我的 MVC 控制器,以便能够使用 JWT 身份验证(如果它存在于标头中)或 Cookie 身份验证(如果请求中存在 cookie)(旧版 Web应用程序)。我不确定是否需要创建自定义中间件来完成此操作,或者是否有一种方法可以在启动时配置某些内容而无需创建中间件,并且控制器 [authorize] 属性只会知道使用 cookie 或不记名身份验证。我发现一篇文章解释说这在 Core 上是可能的,但尚未找到与 .NET 框架相关的任何内容。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
//configuration goes here
});
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
//configuration goes here
}
Run Code Online (Sandbox Code Playgroud)
选项 2: 在我的旧应用程序服务器中创建一个新端点,并让我的移动客户端将我收到的不记名令牌传递到该端点以建立会话。现在,我的移动客户端可以在每个请求中传递 cookie 和不记名 JWT 令牌,并让服务器决定如何验证。这显然增加了一点复杂性,因为现在我正在维护 cookie 和令牌过期等,但这只会持续到迁移结束。
选项3: ???
问题: 我花了很多时间研究这两个选项的有效性,并且大多只获得与 .NET core 相关的资源,但很少有关于 .NET Framework 的资源。我只需要在短时间内支持遗留应用程序,因此我现在正在寻找最简单的解决方案,而不是最干净的解决方案。想知道是否有做过类似迁移的人可以提供解决方案或了解他们如何实现这一目标?
我最近做了类似的事情,在同一个项目中使用了 API 控制器和 MVC 控制器。API 控制器使用 JWT 进行身份验证,MVC 控制器使用 Cookie 身份验证。
这可能不会直接转化为您的问题,但希望它能有所帮助......
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 }
);
}
}
Run Code Online (Sandbox Code Playgroud)
重要的部分是config.SuppressDefaultHostAuthentication();和config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
这里剩下的部分是实际构建令牌然后使用它。
| 归档时间: |
|
| 查看次数: |
5328 次 |
| 最近记录: |