Asp.Net MVC Core 2 - 共享身份验证cookie

时间:2018-06-13 17:08:08

标签: model-view-controller asp.net-core-2.0 cookie-authentication

我在localhost下运行多个应用程序,最终将在https://myapp.com/一个域名下部署 应用程序将如下:

https://myapp.com/security
https://myapp.com/app1
https://myapp.com/app2

App Architecture

当用户访问app1时,它会在内部使用安全应用程序登录。 我正在使用cookie身份验证。现在,当用户移动到app2时,我希望app2使用app1创建的cookie,并且不要求再次进行身份验证。

Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            options.AccessDeniedPath = new PathString("/LogUser/RestrictedAccess");
            options.LoginPath = new PathString("/LogUser/Login");
            options.SlidingExpiration = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
            options.SessionStore = new MemoryCacheTicketStore();
            options.Cookie.Name = ".AspNet.SharedCookie";
            options.Cookie.Path = "/";
            options.ReturnUrlParameter = "OriginalUrl";
        });
        services.AddSession();
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseSession();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

1 个答案:

答案 0 :(得分:0)

有两个主要选择:

  1. 使用分散式身份验证/授权平台。 Auth0提供付费的插入式解决方案,或者您可以使用IdentityServer设置自己的解决方案。虽然设置可能更复杂,但是这条路线将为您提供可扩展的解决方案,满足您现在和将来的需求。决定你还需要一个API应用程序吗?你很高兴。

  2. 直接分享Cookie。这实现起来相对简单,但很快就会过时。如果其中一个应用程序最终需要托管在不同的域中,那么您就会感到烦恼。需要授权API吗?运气不好。

  3. 如果您决定使用选项#2(问题中要求的方法),那么您需要处理以下几项事项:

    1. 由于这取决于所有看到相同Cookie的应用,因此您需要确保它们全部托管在该域的相同域或子域中(在这种情况下,您需要'我需要让cookie的域名成为通配符)。看起来情况已经如此,但值得强调的是这一点。如果您的设置发生变化,以至于部分应用无法再看到Cookie,那么您就已经完成了。

    2. 您需要为每个应用配置相同的DataProtectionProvider。使用DataProtectionProvider加密身份验证cookie(以及会话cookie等)。从某种意义上说,这有点类似于旧学校在每个应用程序的web.config中设置相同机器密钥的方法,除了ASP.NET Core没有使用web.config并且没有& #39;使用机器密钥进行加密。相反,您需要确保它使用持久密钥存储,每个应用程序都可以访问和使用该密钥存储,并禁用该应用程序隔离。我建议深入研究docs,以确保您能够很好地处理您正在处理的事情以及一切如何运作。