C# 与.NET核心应用程序共享ASP.NET Owin Cookies,同时保留azure存储的密钥
我们有一个基于ASP.NETFramework(4.7.2)构建的WebForms应用程序,它使用OWIN cookie身份验证。 作为向.Net Core迁移的一部分,我们希望在.Net Core(2.1)API应用程序中使用cookie WebForms应用程序在Azure中运行,并利用C# 与.NET核心应用程序共享ASP.NET Owin Cookies,同时保留azure存储的密钥,c#,asp.net,asp.net-core,cookies,azure-blob-storage,C#,Asp.net,Asp.net Core,Cookies,Azure Blob Storage,我们有一个基于ASP.NETFramework(4.7.2)构建的WebForms应用程序,它使用OWIN cookie身份验证。 作为向.Net Core迁移的一部分,我们希望在.Net Core(2.1)API应用程序中使用cookie WebForms应用程序在Azure中运行,并利用DataProtectionStartup连接到IServiceCollection 在Microsoft.AspNetCore.DataProtection 根据Microsoft文档 WebFormsDa
DataProtectionStartup
连接到IServiceCollection
在Microsoft.AspNetCore.DataProtection
根据Microsoft文档
WebFormsDataProtectionStartup
services.AddDataProtection()
.PersistKeysAzureBlobStorage(blockblob)
.SetApplicationName(“我们的AppName”);
.Net核心API启动
services.AddDataProtection()
.PersistKeysAzureBlobStorage(blockblob)
.SetApplicationName(“我们的AppName”);
两个应用程序都在愉快地运行,机器密钥生成并存储在blob存储中
微软有
这详细说明了如何使用
DataProtectorShim
来自Microsoft.Owin.Security.Interop
。DataProtectionShim
需要一个DataProtectionProvider
从共享机器密钥生成,在文档中,这在创建
cookie并使用将文件位置作为参数的DataProtectionProvider.Create()
方法
由于我们对blob存储使用数据保护
,因此我们没有此位置。我们已经尝试使用
DataProtectionProvider.Create()
仅在两个应用程序上使用应用程序名,因为它将使用blob
存储密钥文件。不幸的是,这并不能创建一个跨两个应用程序工作的cookie
OwinStartup
中的OWIN cookie身份验证设置:
app.UseCookieAuthentication(新的CookieAuthenticationOptions
{
AuthenticationType='Identity.Application',
AuthenticationMode=Microsoft.Owin.Security.AuthenticationMode.Active,
LoginPath=新路径字符串(“/login.aspx”),
CookieName=“AppCookieName”,
ExpireTimeSpan=300,
slidengexpiration=true,
Provider=新CookieAuthenticationProvider
{
OnValidateId实体=
证券StampValidator
.OnValidateId实体(
validateInterval:TimeSpan.FromMinutes(30),
regenerateIdentityCallback:(管理者,用户)=>
manager.CreateIdentityAsync(用户'Identity.Application'),
getUserIdCallback:(user)=>user.GetUserId()
},
TicketDataFormat=新的AspNetTicketDataFormat(
新数据保护器(
DataProtectionProvider.Create(“OurAppName”)
.CreateProtector(
“Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware”,
“Identity.Application”,
“v2”)
)),
CookieManager=新建ChunkingCookieManager()
});
以及我们的.Net核心启动
cookie设置:
services.AddAuthentication(“Identity.Application”)
.AddCookie(“Identity.Application”,选项=>
{
options.Cookie.Name=“AppCookieName”;
});
以前有没有人遇到过这种情况,我们找到的所有示例都只是使用
DataProtectionProvider.Create()
与机器密钥文件位置一起使用,但没有找到如何完成的指导
这是通过PersistKeyStazureBlobstorage
方法实现的。我最终要做的是(ab)使用DI系统(使用Microsoft.Extensions.DependencyInjection
NuGet)来获得我想要的行为:
private static IDataProtector ConfigureDataProtection()
{
// TODO this has to be wrong
ServiceCollection services = new ServiceCollection();
ConfigurationOptions configurationOptions = ConfigurationOptions.Parse("REDIS_CONNECTION_STRING_HERE");
ConnectionMultiplexer rmp = ConnectionMultiplexer.Connect(configurationOptions);
services.AddDataProtection()
.SetApplicationName("APPNAME")
.PersistKeysToStackExchangeRedis(rmp, "REDIS_DATA_PROTECTION_LIST_KEY");
ServiceProvider provider = services.BuildServiceProvider();
IDataProtectionProvider dataProtectionProvider = provider.GetRequiredService<IDataProtectionProvider>();
return dataProtectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", "Cookies" /* <- Auth Type to match the ASP.NET Core side, the rest is CRUCIAL and has to be the same purpose strings as internally used by ASP.NET Core */, "v2");
}
专用静态IDataProtector ConfigureDataProtection()
{
//这一定是错的
ServiceCollection服务=新建ServiceCollection();
ConfigurationOptions ConfigurationOptions=ConfigurationOptions.Parse(“REDIS\u CONNECTION\u STRING\u HERE”);
ConnectionMultiplexer rmp=ConnectionMultiplexer.Connect(配置选项);
services.AddDataProtection()
.SetApplicationName(“APPNAME”)
.PersistKeystockExchangeRedis(rmp,“REDIS数据保护列表密钥”);
ServiceProvider=services.BuildServiceProvider();
IDataProtectionProvider dataProtectionProvider=provider.GetRequiredService();
返回dataProtectionProvider.CreateProtector(“Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware”,“Cookies”/*我正在尝试做完全相同的事情。您找到任何解决方案来指向OWIN的共享AzureBlob以获取数据保护密钥吗?也遇到了这个问题,但什么也找不到。在dev env中测试时,即使记录在案的单机文件夹位置似乎也不起作用,因为这两个应用程序的密钥不同(OWIN侧的数据保护抛出“钥匙环中未找到钥匙”错误).fulling.FWIW如果有人后来读到这一点,问题是一个旧的/过时的cookie,具有不同的/过期的密钥;加密异常
被隐藏得非常深..我甚至用实际的git克隆替换了大多数Microsoft.Owin.*和Microsoft.AspNetCore.*NUGET进行调试,但打开了跟踪日志记录因为这些名称空间在事后看来也会这样做。@ScottBrightman我还没有找到解决方案,最近也没有时间研究这个问题。@RanSagy感谢您详细介绍您的解决方案,我将在下周查看它,看看它是否为我们解决了这个问题。