我在localhost下运行多个应用程序,最终将在https://myapp.com/一个域名下部署 应用程序将如下:
https://myapp.com/security
https://myapp.com/app1
https://myapp.com/app2
当用户访问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?}");
});
}
答案 0 :(得分:0)
有两个主要选择:
使用分散式身份验证/授权平台。 Auth0提供付费的插入式解决方案,或者您可以使用IdentityServer设置自己的解决方案。虽然设置可能更复杂,但是这条路线将为您提供可扩展的解决方案,满足您现在和将来的需求。决定你还需要一个API应用程序吗?你很高兴。
直接分享Cookie。这实现起来相对简单,但很快就会过时。如果其中一个应用程序最终需要托管在不同的域中,那么您就会感到烦恼。需要授权API吗?运气不好。
如果您决定使用选项#2(问题中要求的方法),那么您需要处理以下几项事项:
由于这取决于所有看到相同Cookie的应用,因此您需要确保它们全部托管在该域的相同域或子域中(在这种情况下,您需要'我需要让cookie的域名成为通配符)。看起来情况已经如此,但值得强调的是这一点。如果您的设置发生变化,以至于部分应用无法再看到Cookie,那么您就已经完成了。
您需要为每个应用配置相同的DataProtectionProvider
。使用DataProtectionProvider
加密身份验证cookie(以及会话cookie等)。从某种意义上说,这有点类似于旧学校在每个应用程序的web.config中设置相同机器密钥的方法,除了ASP.NET Core没有使用web.config并且没有& #39;使用机器密钥进行加密。相反,您需要确保它使用持久密钥存储,每个应用程序都可以访问和使用该密钥存储,并禁用该应用程序隔离。我建议深入研究docs,以确保您能够很好地处理您正在处理的事情以及一切如何运作。