0

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

应用程序将如下所示:

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

应用架构

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

启动.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?}");
        });
    }
4

1 回答 1

0

有两个主要选项:

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

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

如果您决定使用选项 #2(您的问题中要求的方法),则需要注意以下几点:

  1. 由于这取决于看到相同 cookie 的所有应用程序,因此您需要确保它们都托管在同一域或该域的子域中(在这种情况下,您需要将 cookie 的域设为通配符)。看起来情况已经如此,但值得强调这一点。如果您的设置发生更改,使得某些应用程序无法再看到 cookie,那么您就完成了。

  2. 您需要DataProtectionProvider为每个应用程序配置相同的。auth cookie(以及会话 cookie 等)使用DataProtectionProvider. 从某种意义上说,这有点类似于在每个应用程序的 web.config 中设置相同机器密钥的老派方法,只是 ASP.NET Core 不使用 web.config 并且不使用机器密钥进行加密。相反,您需要确保它使用持久密钥存储,每个应用都可以访问和使用该密钥存储,并且禁用应用隔离。我建议深入研究文档,以确保您对正在处理的内容以及一切工作方式有很好的了解。

于 2018-06-13T18:02:37.763 回答