【发布时间】: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