Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与.NET核心应用程序共享ASP.NET Owin Cookies,同时保留azure存储的密钥_C#_Asp.net_Asp.net Core_Cookies_Azure Blob Storage - Fatal编程技术网

C# 与.NET核心应用程序共享ASP.NET Owin Cookies,同时保留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

我们有一个基于ASP.NETFramework(4.7.2)构建的WebForms应用程序,它使用OWIN cookie身份验证。 作为向.Net Core迁移的一部分,我们希望在.Net Core(2.1)API应用程序中使用cookie

WebForms应用程序在Azure中运行,并利用
DataProtectionStartup
连接到
IServiceCollection
Microsoft.AspNetCore.DataProtection
根据Microsoft文档

WebForms
DataProtectionStartup

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感谢您详细介绍您的解决方案,我将在下周查看它,看看它是否为我们解决了这个问题。