gpt4 book ai didi

c# - 与 .NET Core 应用程序共享 ASP.NET Owin Cookie,同时将 key 保存到 Azure 存储

转载 作者:行者123 更新时间:2023-12-04 13:38:17 25 4
gpt4 key购买 nike

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

WebForms 应用程序在 Azure 中运行并利用 DataProtectionStartup Hook IServiceCollection使用 PersistKeysToAzureBlobStorage 的机器 key 文件内的方法 Microsoft.AspNetCore.DataProtection根据 Microsoft 文档。

网络表单 DataProtectionStartup

    services.AddDataProtection()
.PersistKeysToAzureBlobStorage(blockblob)
.SetApplicationName("OurAppName");

.Net 核心 API Startup
    services.AddDataProtection()
.PersistKeysToAzureBlobStorage(blockblob)
.SetApplicationName("OurAppName");

两个应用程序都在使用生成并存储在 blob 存储上的机器 key 愉快地运行。

微软有
documention
详细说明如何使用共享机器 key 文件共享 OWIN cookie,使用 DataProtectorShim来自 Microsoft.Owin.Security.Interop . DataProtectionShim需要 DataProtectionProvider从共享机器 key 生成,在文档中,这在两个应用程序中都被引用以创建
cookie 并使用 DataProtectionProvider.Create()将文件位置作为参数的方法。

因为我们正在使用 DataProtection使用 blob 存储,我们没有这个位置。我们已经尝试使用 DataProtectionProvider.Create()两个应用程序上都只有应用程序名称,因为它将使用 blob
存储 key 文件。不幸的是,这不会创建一个可以跨两个应用程序工作的 cookie。
OwinStartup 中的 OWIN cookie 身份验证设置:

    app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = 'Identity.Application',
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
LoginPath = new PathString("/login.aspx"),
CookieName = "AppCookieName",
ExpireTimeSpan = 300,
SlidingExpiration = true,

Provider = new CookieAuthenticationProvider
{
OnValidateIdentity =
SecurityStampValidator
.OnValidateIdentity<UserManager, User, int>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentityCallback: (manager, user) =>
manager.CreateIdentityAsync(user, 'Identity.Application'),
getUserIdCallback: (user) => user.GetUserId<int>())
},
TicketDataFormat = new AspNetTicketDataFormat(
new DataProtectorShim(
DataProtectionProvider.Create("OurAppName")
.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
'Identity.Application',
"v2")
)),

CookieManager = new ChunkingCookieManager()
});

还有我们的 .Net Core Startup cookie 设置:

    services.AddAuthentication("Identity.Application")
.AddCookie("Identity.Application", options =>
{
options.Cookie.Name = "AppCookieName";
});

有没有人遇到过这个场景,我们找到的所有例子都只是使用的例子 DataProtectionProvider.Create()与机器 key 文件位置一起使用,但没有找到如何完成的指导
这与 PersistKeysToAzureBlobStorage方法。

最佳答案

我最终做的是(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");
}

虽然我的示例使用了 Redis,但我想这同样适用于其他实现。

关于c# - 与 .NET Core 应用程序共享 ASP.NET Owin Cookie,同时将 key 保存到 Azure 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60529355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com