Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在.Net Framework遗留应用程序中使用会话cookie和/或JWT承载令牌进行身份验证_Asp.net Mvc_Oauth 2.0_Asp.net Identity_Identityserver4_Openid Connect - Fatal编程技术网

Asp.net mvc 在.Net Framework遗留应用程序中使用会话cookie和/或JWT承载令牌进行身份验证

Asp.net mvc 在.Net Framework遗留应用程序中使用会话cookie和/或JWT承载令牌进行身份验证,asp.net-mvc,oauth-2.0,asp.net-identity,identityserver4,openid-connect,Asp.net Mvc,Oauth 2.0,Asp.net Identity,Identityserver4,Openid Connect,我目前正在使用微服务将现有的ASP.NET MVC单片应用程序迁移到.NET Core。现在,此迁移的一部分涉及将Identity Server 4与外部身份提供程序一起使用。迁移使用的是我们正在缓慢地迁移出旧系统,而不是一次完成整个迁移。因此,我们必须支持使用基于cookie的会话身份验证的遗留系统以及使用JWT承载令牌的新微服务API 目前,我正在探索最简单的方法来支持这两种类型的身份验证,直到迁移100%完成。web应用程序很好,因为它仍然使用razor页面和服务器端身份验证,因此可以轻松

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

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

选项1: 在我的移动应用程序上严格使用我的JWT承载令牌进行身份验证,并以某种方式配置我的MVC控制器,使其能够在标头中存在JWT身份验证时使用JWT身份验证,或者在请求中存在Cookie时使用Cookie身份验证(遗留web应用程序)。我不确定是否需要创建自定义中间件来实现这一点,或者是否有一种方法可以在启动时配置某些东西,而不必创建中间件,并且controllers[authorize]属性只知道使用cookie或bearer auth。我发现一篇文章解释说这在Core上是可能的,但还没有找到任何与.NETFramework相关的东西

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

        app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
        {
           //configuration goes here    
        }
选项2: 在我的遗留应用服务器中创建一个新的端点,并让我的移动客户端将我收到的承载令牌传递给该端点,以便建立会话。现在,我的移动客户端可以在每个请求中传递cookie和承载JWT令牌,并让服务器决定如何进行验证。这显然增加了一点复杂性,因为现在我正在维护cookie和令牌到期等,但这只会持续到迁移结束

选项3:

问题:
我花了很多时间研究这两个选项的有效性,大部分只得到与.NETCore相关的结果,但在.NETFramework上很少。我只需要在短时间内支持遗留应用程序,因此我现在正在寻找最简单的解决方案,而不是最干净的解决方案。想知道做过类似迁移的人是否能提供解决方案,或者了解他们是如何做到这一点的?

我最近做了类似的事情,在同一个项目中使用了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 }
        );

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

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


这看起来像我正在寻找的,Api和MVC控制器都存在相同的问题,需要为Api使用JWT令牌,为MVC使用cookie。。我不明白的是,如果你在启动时有app.useCookie身份验证,你在哪里做app.UseJwtBearerAuthentication?我的应用程序正在进行WIF,并且有一个claimsauthorize过滤器,用于检查用户声明的角色等。。对于api endpionts/tokens,我希望进行范围授权,并让特定于用户的访问令牌和客户端凭据为其他api授予特定的令牌以调用它。你可以发布更多的代码吗?我在下面介绍JWT承载令牌的cookie身份验证(在另一个api中工作):你应该能够在同一个类中使用app.useJWTBeareAuthentication。我不确定你到底在说什么,你需要范围授权..我的意思是,我有HostAuthenticationFilter为api端点工作,如上所述,端点将工作。。但是如果我用[Authorize]或在我的例子中是[ScopeAuthorizate(“myColScope”)]修饰端点,它总是未经授权的,并且在调试时,Principal.IsAuthenticated=false。。因此,我正在尝试解决如何对web api端点使用承载令牌进行范围授权,而对mvc应用程序使用cookie auth。nevermind。。头砰砰地撞在我的桌子上。。一直以来,我都忘了在令牌身份验证设置的ValidisUser属性中添加一个尾随斜杠。。scopeAuthorize属性现在按预期工作:)