asp.net-core - 带有 IdentityServer4 的 Asp.net Core 2 - cookie 过期后重定向到登录
问题描述
我有一个使用 IdentityServer4 服务器进行身份验证的 Asp.net Core 2.2 MVC 应用程序。它的配置如您在底部看到的那样,用于快速测试的时间非常短。
期望的行为是:
- 登录(假设没有勾选“记住我”)
- 做事...
- 等到会话过期
- 在下一个导航中,单击登录页面上的重定向以进行新的交互式登录
我想我必须在 cookie 和会话服务器端工作,但我的第一个疑问是我必须更多地使用 id_token。
无论如何,当前的行为是:
- 在没有“记住我检查”的情况下登录
- 等到会话过期
- 单击一个虚拟页面,我看到会话是空的(如预期的那样)-> 登录在顶部菜单上可用
- 所以我点击登录 - >没有显示登录页面- >一个新的会话服务器端可用,并且在浏览器中有一个新值“.AspNetCore.Cookies”,但对于“.AspNetCore.Identity.Application”和“ idsrv.session”。
如果我注销,cookie 客户端将被正确删除,因此在下一次登录时会显示预期的凭据表单。
我做错了什么?尝试获取新的交互式登录检查 cookie 过期是否正确?我是否必须按照另一种方式处理 ids (id_token) 对象?
代码
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.None;
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromSeconds(30);
})
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = Configuration.GetValue<string>("IdentitySettings:Authority");
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.SaveTokens = true;
options.Events.OnTicketReceived = async (context) =>
{
context.Properties.ExpiresUtc = DateTime.UtcNow.AddSeconds(30);
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() || env.IsStaging())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseAuthentication();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
编辑
注销完成如下
public async void OnPost()
{
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc",
new AuthenticationProperties
{
RedirectUri = "http://localhost:5002"
});
}
解决方案
推荐阅读
- javascript - HTML Canvas,迟钝而笨重
- excel - Excel - 基于值的条形图中的彩色条
- java - 预期的 Android 类接口
- python - 在 Python 3+ 多继承中使用 super 来初始化带参数的父类
- json - 如何在nodejs中逐个对象读取对象而不从json文件中知道其结构
- android - 看不到调试日志 - 华为 P10
- php - 引导进度条不显示
- swift - Swift 标签栏徽章
- mysql - 无法将我的应用程序连接到 Docker 作曲家网络中的 MySql 服务
- amazon-web-services - 拒绝太多组中的用户的 AWS EFS 权限