首页 > 解决方案 > 如何在 Webforms 应用程序和 AspNetCore 子应用程序之间共享 HttpContext.Identity

问题描述

我有一个在 IIS 中运行的 ASP.NET Webforms 应用程序。我想将 AspNetCore 应用程序部署为上述应用程序的子应用程序。AspNetCore 应用程序使用 AspNetCore Identity。我希望使用主应用程序或子应用程序对用户进行身份验证,并让两个应用程序都可以访问 HttpContext.Identity ,以便用户在主应用程序和子应用程序中都经过身份验证。

我想一个更简洁的问题可能是: HttpContext.Identity 是否在 IIS 中的应用程序及其子应用程序之间共享?

标签: asp.net-coreauthenticationwebformshttpcontext

解决方案


是的,这是可能的。您需要设置一个共享位置来存储密钥。查看这篇文章: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);
    }

推荐阅读