asp.net-core - 如何在 Webforms 应用程序和 AspNetCore 子应用程序之间共享 HttpContext.Identity
问题描述
我有一个在 IIS 中运行的 ASP.NET Webforms 应用程序。我想将 AspNetCore 应用程序部署为上述应用程序的子应用程序。AspNetCore 应用程序使用 AspNetCore Identity。我希望使用主应用程序或子应用程序对用户进行身份验证,并让两个应用程序都可以访问 HttpContext.Identity ,以便用户在主应用程序和子应用程序中都经过身份验证。
我想一个更简洁的问题可能是: HttpContext.Identity 是否在 IIS 中的应用程序及其子应用程序之间共享?
解决方案
是的,这是可能的。您需要设置一个共享位置来存储密钥。查看这篇文章:https ://github.com/blowdart/idunno.CookieSharing和这篇文章https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-3.1#与 aspnet 核心身份共享身份验证 cookie
我最终使用 Redis 作为共享位置,但您可以只使用共享文件夹。
在 .Net Core 3.1 webapp 上,您将需要以下 startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
var redis = ConnectionMultiplexer.Connect("192.168.1.96:6379");
IDataProtector proc = DataProtectionProvider.Create(new DirectoryInfo(@"C:\test\core"), (builder) => { builder.SetApplicationName("MyApp").ProtectKeysWithDpapi().DisableAutomaticKeyGeneration().PersistKeysToStackExchangeRedis(redis); })
.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", "Cookies", "v2");
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.TicketDataFormat = new TicketDataFormat(proc);
options.SlidingExpiration = true;
options.Cookie = new CookieBuilder
{
Domain = "localhost",
Name = ".SSO",
SecurePolicy = CookieSecurePolicy.None,
IsEssential = true,
};
});
确保你有app.UseAuthentication(); app.UseAuthorization();
。public void configure()
然后在 ASP.NET 4.8 Web Forms 应用程序上,您将需要以下 startup.cs
public void Configuration(IAppBuilder app)
{
CookieAuthenticationOptions opt = new CookieAuthenticationOptions();
opt.AuthenticationType = CookieAuthenticationDefaults.AuthenticationType;// "Identity.Application";
opt.CookieName = ".SSO";
opt.CookieDomain = "localhost";
opt.SlidingExpiration = true;
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.1.96:6379");
IDataProtector proc = DataProtectionProvider.Create(new DirectoryInfo(@"C:\test\core"), buildAction =>
buildAction.SetApplicationName("MyApp").SetDefaultKeyLifetime(TimeSpan.FromDays(9000)).ProtectKeysWithDpapi().PersistKeysToStackExchangeRedis(redis)).CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", "Cookies", "v2");
DataProtectorShim shim = new DataProtectorShim(proc);
opt.TicketDataFormat = new AspNetTicketDataFormat(shim);
app.UseCookieAuthentication(opt);
}
推荐阅读
- angular - Controllers.cs 适用于不同的地址 - 来自 Visual Studio 模板的 .net core angular 应用程序
- python - 如何在mysql中将JSON数据从一个表保存到另一个表时删除多余的双引号
- apache-spark - Spark 应用程序因错误“Signal Term”而终止
- swift - 在 Swift 中将文本限制为一定数量的单词
- path-finding - 从 Godot 中的 Curve3D (Path) 获取手动定义的向量
- ios - iOS 存储 SQLite 数据库
- c# - gRPC 间歇性地具有高延迟
- javascript - 选项卡:数据切换不展开数据
- android - Wifi状态不会在android中改变?
- keyboard - Android WebVIew中的键盘长键按下