如何将Net 6身份授权流到YARP代理的Net Framework应用程序



我正在尝试使用扼杀配置模式分阶段迁移遗留的NetFrameworkMVC应用程序。我听了Mark Rendle关于使用YARP以这种方式迁移Webforms应用程序的演讲,这很好。然而,我在任何地方都找不到任何使用这种方法从Net Framework MVC应用程序迁移到新的Net 6 MVC应用程序的例子。

我已经成功地设置了正在运行的基本代理(请参阅下面的示例repo(。然而,我不知道从哪里开始将身份验证从Net6应用程序流到NetFramework应用程序。我可以看到auth cookie被传递到代理的Net Framework应用程序,但我不知道如何接受它并说";嘿,用这个"在Framework应用程序中。

链接:

  • 回购示例
  • Microsoft YARP代理
  • Strangler无花果图案(Microsoft文档(

任何关于如何实现此身份验证流的指针都将不胜感激。

微软一定得到了很多。。。

他们创建了一个新的nuget包(目前正在预览中(:

Microsoft.AspNetCore.SystemWebAdapters

并有一篇关于其使用的文章(感谢Mike Rousos!(:

https://devblogs.microsoft.com/dotnet/incremental-asp-net-migration-tooling-preview-2/

我已经更新了我的示例git-reo,并修改了一些部分,一切似乎都如预期的那样工作。

快乐的日子。

我自己也有这样的场景。我解决这个问题的方法是控制在两个应用程序中编写身份验证cookie。该方法依赖于由ASP.NET Core应用程序编写的身份验证cookie能够被Framework应用程序解密。这样,Framework应用程序会将每个请求视为来自其认为已经登录的用户。如果用户的第一个请求直接命中Framework应用程序,他们将像往常一样进行身份验证,但cookie将以Core应用程序能够理解的格式编写。

要点:

  • 我的框架应用程序使用Owin
  • 必须将NuGet包Microsoft.Owin.Security.Interop添加到Framework应用程序
  • 我使用Microsoft.Identity.Web(2.5.0(在Core应用程序中使用OpenID对用户进行身份验证
  • 这两个应用程序都覆盖cookie行为以使用名为TicketDataFormat的类(在核心中(和AspNetTicketDataFormat(在框架中(。AspNetTicketDataFormat在Interop包中实现。这两个类都有一个接受IDataProtector的构造函数(您必须编写自己的实现——或者,至少我编写了(
  • 在这个场景中有两个IDataProtector接口。Core应用程序中的是Microsoft.AspNetCore.DataProtection.IDataProtector,Framework应用程序中是Microsoft.Owin.Security.DataProtection.ID ataProtector

这是核心应用程序中Program.cs的相关部分:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(
identityOptions => 
builder.Configuration.GetSection("AzureAd").Bind(identityOptions),
cookieOptions =>
{
cookieOptions.Cookie.Name = ".AspNet.SharedAuthCookie";
cookieOptions.Cookie.HttpOnly = true;
cookieOptions.Cookie.IsEssential = true;
cookieOptions.Cookie.Path = "/";
cookieOptions.Cookie.SameSite = SameSiteMode.Lax;
cookieOptions.ExpireTimeSpan = TimeSpan.FromHours(1);
cookieOptions.TicketDataFormat = new TicketDataFormat(new AesDataProtector(builder.Configuration["AuthCookieEncryptionKey"]));
cookieOptions.CookieManager = new ChunkingCookieManager();
});

这是Startup.Auth.cs在Framework应用程序中的相关部分:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
CookieName = ".AspNet.SharedAuthCookie",
CookieSameSite = SameSiteMode.Lax,
ExpireTimeSpan = TimeSpan.FromHours(1),
SlidingExpiration = true,
TicketDataFormat = new AspNetTicketDataFormat(new AesDataProtector(authCookieEncryptionKey)),
CookieManager = new ChunkingCookieManager()
});

类AesDataProtector是我自己的类,有两个。Core和Framework应用程序中各有一个,每个应用程序都实现适当的IDataProtector接口。这些类实际上完成了cookie数据的读取和写入。按照我对AesDataProtector类进行编码的方式,它们将作为字符串值的键(在每个应用程序中必须是相同的键(传递到构造函数中。在这两个类中,我都使用了System.Security.Cryptography.Aes来进行加密和解密。你可以使用任何对你有意义的cookie名称,但在两个应用程序中必须相同。

我们已经对Framework应用程序进行了更改,因此用户的身份验证cookie现在以新的方式编写,没有给我们带来任何问题。在测试中证明了这一点后,我们知道,当我们准备部署Core应用程序时,身份验证将"正常工作"。

我发现这篇文章对解决这个问题有很大帮助:https://learn.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-7.0

相关内容

  • 没有找到相关文章

最新更新