【问题标题】:Using ASP.Net Core 2.2 Auth Cookies in old .Net Web Forms (aspx) site for SSO在旧的 .Net Web 表单 (aspx) 站点中使用 ASP.Net Core 2.2 Auth Cookie 进行 SSO
【发布时间】:2019-04-16 01:40:20
【问题描述】:

TLDR:如何获得旧版 Web 表单应用程序可以理解的 Asp.Net Core 2.2 加密身份验证 cookie?

DR:

我发现自己正试图让旧版 Web 表单 (aspx) 站点使用由新的闪亮的 .NET Core 2.2 MVC 站点在浏览器中设置的身份验证 cookie。有问题的 Web 窗体应用程序是用 Visual Basic 编写的,即 C# 中的 .Net Core 应用程序。一切都由 IIS/IIS Express(来自 Visual Studio)托管。

cookie 似乎设置得很好,为了让事情变得简单(目前),所有东西都托管在同一台机器上(我的 Windows 10 专业版戴尔 XPS)。用于 cookie 加密的加密/机器密钥位于磁盘上明确定义的位置。 .Net Core 应用程序(我们暂时称其为“Auth Portal”)基本上是 AWS Cognito 的前端。

在 Auth Portal 中,cookie 在 Startup.cs 中的配置如下:

services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        var keyDir = Configuration["AuthSettings:CookieEncryptionKeyDir"];
        services.AddDataProtection()
            .PersistKeysToFileSystem(new DirectoryInfo(keyDir))
            .SetApplicationName(Configuration["ApplicationName"]);

        services.AddCognitoIdentity();
        services.AddSingleton(typeof(IAmazonCognitoIdentityProvider),
            _ => new AmazonCognitoIdentityProviderClient(RegionEndpoint.APSoutheast2)); // Oh no you know I'm using Sydney!

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie();

        services
            .ConfigureApplicationCookie(options =>
            {
                var parseSucceeded = int.TryParse(Configuration["AuthSettings:CookieExpiryHours"],
                    out var cookieExpiry);
                if (!parseSucceeded) _log.LogError("Failed to parse from configuration auth cookie expiry value");

                parseSucceeded = bool.TryParse(Configuration["AuthSettings:SSLCookieOnly"], out var secureCookieOnly);
                var securePolicy = secureCookieOnly ? CookieSecurePolicy.Always : CookieSecurePolicy.SameAsRequest;
                if (!parseSucceeded) _log.LogError("Failed to parse from configuration cookie security policy");

                options.Cookie.HttpOnly = true;
                options.ExpireTimeSpan = TimeSpan.FromHours(cookieExpiry);
                options.SlidingExpiration = true;
                options.LoginPath = Configuration["AuthSettings:LoginUrl"];
                options.LogoutPath = Configuration["AuthSettings:LogoutUrl"];
                options.Cookie.Domain = Configuration["AuthSettings:TrustedDomains"];
                options.Cookie.Name = Configuration["AuthSettings:CookieName"];
                options.Cookie.SecurePolicy = securePolicy;
            });

        services
            .Configure<SecurityStampValidatorOptions>(o =>
            {
                o.ValidationInterval = TimeSpan.FromHours(1);
            });

        services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardLimit = 2;
            options.ForwardedForHeaderName = "X-Forwarded-For-Auth-Portal";
        });

在 Web 表单应用程序中,我将替换现有的默认 sql auth。这就是在线资源似乎枯竭的地方。我可以制作一个我很容易完成的自定义会员提供程序。但它不(可以理解)理解现有的 cookie 开箱即用,即使我在表单身份验证设置中设置 cookie 名称

<authentication mode="Forms">
  <forms timeout="60" name="my.sso.cookie" requireSSL="false" path="/"  />
</authentication>
<membership defaultProvider="CognitoMembershipProvider" userIsOnlineTimeWindow="60">
  <providers>
    <clear />
    <add name="CognitoMembershipProvider" type="TheOldWebFormsApp.Authentication.CognitoMembershipProvider" applicationName="MyWebForms" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="false" passwordFormat="Clear" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="3" maxInvalidPasswordAttempts="8" />
  </providers>
</membership>

正如我发现的那样,它只会覆盖现有的 cookie,我假设这是因为它认为无法理解的 cookie 是不存在的。

我想这是一个非常啰嗦的方式来询问我如何才能让这个旧的 Web 窗体应用程序接受和解密 Auth Portal cookie?

干杯~!

【问题讨论】:

  • 如果我理解正确,您希望将 SSO 与 Web 表单应用程序一起使用,但我看不到您如何处理从 Web 表单应用程序重定向到您拥有的身份提供者的方式,这可以提供一个更好的主意您如何处理来自网络表单的登录选项。同时,您的身份提供者应将该 Webform 应用程序标识为受信任的应用程序。您呈现的只是身份验证模式的配置
  • @Zinov 在这种情况下,我的身份验证门户是有效的身份提供者。 Auth Portal 和 Webforms 应用程序位于同一个域中,cookie 设置为信任根域(目前)。出于所有意图和目的,auth cookie 已经在浏览器内存中,并且与对 webform 应用程序的每个请求一起附加。

标签: vb.net asp.net-core webforms single-sign-on asp.net-core-2.2


【解决方案1】:

不幸的是,这是不可能的。 ASP.NET Core 使用与 ASP.NET 完全不同的方法来加密 cookie。后者基于“机器密钥”,但 ASP.NET Core 使用数据保护提供程序和密钥环。两者从根本上是不兼容的,所以即使你可以“共享”cookie,让每个人看到它,一个人也无法解密另一个人设置的cookie。

可以与 ASP.NET MVC 5 成功共享 cookie,但那是因为它使用了 OWIN,并且数据保护的东西与 OWIN 兼容。因此,即使 MVC 5 本身也使用机器密钥,也可以改为使用数据保护,然后它可以与 ASP.NET Core 站点共享相同的数据保护密钥存储。但是,Web 窗体不支持 OWIN,因此在那里无法实现相同的功能。简而言之,这是完全不行的。

也许,另一种选择是依赖于一个集中的身份提供者,例如 Identity Server、Auth0、Azure AD 等。有了这样的解决方案,就没有必要共享 cookie,因为每个站点都独立地向提供者授权,但是可以使用相同的用户帐户。实际登录发生在身份提供者处,然后通过该身份提供者授权的每个站点都从身份提供者那里获得身份,然后可以设置自己的 cookie 或其他任何东西。

【讨论】:

  • 谢谢克里斯。我也有同样的怀疑。我想我会将精力投入到其他解决方案和/或方法上。 目前希望不要完全依赖第三方提供商。
  • 我只是想更新一下,有可能在 2 个世界之间共享 cookie。我会看看是否有时间详细说明必须完成的工作。
  • @JohnGeddes - 你能分享你想出的解决方案的任何细节(有吗?!)?我正在处理完全相同的“挑战”……我有一个大型 Web 表单站点,该站点将开始迁移到 .NET Core 站点,但我们只需要一次登录。我想,cookie 本身不必共享,只是建立单点登录的一种方式。
  • @MargoNoreen 我不再能够访问我正在实现它的代码库,但我会尽我所能(现在在做其他事情)。我专注于在 VB.NET Webforms 中实现 OWIN(有一些关于此的博客文章)。然后,我依靠 C# 和 VB 可以互换的事实,将我的 .net 核心类转换为 vb(例如将我的 startup.cs 转换为 startup.vb)。如果您发现自己安装了一大堆互操作包,那么您可能走在了正确的轨道上。
猜你喜欢
  • 2021-06-28
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 2022-01-23
相关资源
最近更新 更多