.NET Core 3.1 & Windows 身份验证终止会话变量
.NET Core 3.1 & Windows Authentication Kills Session Variables
每当我在我的 .NET Core 3.1 应用程序上启用 Windows 身份验证时,我的会话变量似乎不再跨请求持续存在。每当我关闭 Windows 身份验证时,会话变量就会再次工作。
我在 Startup.cs 的 ConfigureServices() 部分启用了会话变量:
public void ConfigureServices(IServiceCollection services)
{
//......
services.AddSession(delegate (SessionOptions options)
{
options.IdleTimeout = TimeSpan.FromSeconds(1800);
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.Cookie.SameSite = SameSiteMode.Strict;
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
//......
}
我使用 web.config:
启用了 Windows 身份验证
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<remove name="aspNetCore" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" hostingModel="InProcess" disableStartUpErrorPage="false">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
<security>
<authentication>
<windowsAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
</location>
</configuration>
我在一个 Razor 页面中设置了这样的会话变量 (SET.cshtml):
<div>
@Context.Session.SetString("testvar", "123");
</div>
在另一个 Razor 页面 (GET.cshtml),我检查变量是否持续存在:
<div>
@Context.Session.GetString("testvar")
</div>
当在 web.config 中启用 Windows 身份验证时,会话变量“testvar”在从 SET.cshtml 到 GET.cshtml 时不会保留(GET.cshtml应该显示“123”但它没有)。当我禁用 Windows 身份验证时,它再次开始工作(GET.cshtml 正确显示“123”)。
可能是什么问题?
我想通了这个问题。我没有在 Startup.cs.
中调用“app.UseAuthorization()”
app.UseAuthorization() 需要在 Startup.cs 的 Configure() 方法中调用,以便在 .NET Core 中启用 Windows 身份验证时会话变量在请求中保持不变:
每当我在我的 .NET Core 3.1 应用程序上启用 Windows 身份验证时,我的会话变量似乎不再跨请求持续存在。每当我关闭 Windows 身份验证时,会话变量就会再次工作。
我在 Startup.cs 的 ConfigureServices() 部分启用了会话变量:
public void ConfigureServices(IServiceCollection services)
{
//......
services.AddSession(delegate (SessionOptions options)
{
options.IdleTimeout = TimeSpan.FromSeconds(1800);
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.Cookie.SameSite = SameSiteMode.Strict;
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
//......
}
我使用 web.config:
启用了 Windows 身份验证<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<remove name="aspNetCore" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" hostingModel="InProcess" disableStartUpErrorPage="false">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
<security>
<authentication>
<windowsAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
</location>
</configuration>
我在一个 Razor 页面中设置了这样的会话变量 (SET.cshtml):
<div>
@Context.Session.SetString("testvar", "123");
</div>
在另一个 Razor 页面 (GET.cshtml),我检查变量是否持续存在:
<div>
@Context.Session.GetString("testvar")
</div>
当在 web.config 中启用 Windows 身份验证时,会话变量“testvar”在从 SET.cshtml 到 GET.cshtml 时不会保留(GET.cshtml应该显示“123”但它没有)。当我禁用 Windows 身份验证时,它再次开始工作(GET.cshtml 正确显示“123”)。
可能是什么问题?
我想通了这个问题。我没有在 Startup.cs.
中调用“app.UseAuthorization()”app.UseAuthorization() 需要在 Startup.cs 的 Configure() 方法中调用,以便在 .NET Core 中启用 Windows 身份验证时会话变量在请求中保持不变: