我有一个使用Identity Server 4 oidc混合流作为身份验证器的ASP NET CORE MVC应用程序。
当我加载页面时,如果用户未通过身份验证,它将调用IS4授权端点进行登录。
在身份验证过程之后,在加载页面时,如果我将页面保持空闲状态超过30分钟,然后按下执行对ASP MVC App的AJAX调用的按钮,则它希望重定向到IS4再次授权端点。 (常见的XHR Cors错误)
我找不到此问题的原因。 IS4访问令牌的寿命为2小时。另外,在我的MVC应用程序中,我添加了IS4 AutomaticTokenManagement,因此,如果令牌过期,它将使用刷新令牌自动获取一个新令牌。
此外,我将ASP MVC App Cookie的有效期限设置为一天。
我不知道为什么身份验证会丢失。
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies.Mvc";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies.Mvc", options =>
{
// Configure the client application to use sliding sessions
options.SlidingExpiration = true;
// Expire the session of 15 minutes of inactivity
options.ExpireTimeSpan = TimeSpan.FromDays(1);
})
.AddAutomaticTokenManagement()
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies.Mvc";
options.Authority = MyAuthorityAuthServerSettings.Authority;
options.RequireHttpsMetadata = MyAuthorityAuthServerSettings.RequiredHttpsMetadata;
options.ClientId = MyAuthorityOpenIDSettings.ClientId;
options.ClientSecret = MyAuthorityOpenIDSettings.ClientSecret;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.ResponseType = "code id_token";
options.Scope.Add(MyAuthorityOpenIDSettings.Scope);
options.Scope.Add("offline_access");
options.ClaimActions.MapJsonKey(MyAuthorityClaims.UserId, MyAuthorityClaims.UserId);
options.ClaimActions.MapJsonKey(MyAuthorityClaims.UserName, MyAuthorityClaims.UserName);
options.UseTokenLifetime = false;
});
页面空闲一段时间后,身份验证丢失的原因可能是什么?如果我在另一个导航器选项卡中加载同一页面,则该页面不会重定向到已认证的页面。似乎只有在其空闲并使用ajax调用后才会发生。
更新:
添加了登录/退出代码:
[AllowAnonymous]
public IActionResult Login()
{
return Challenge(new AuthenticationProperties
{
RedirectUri = "/Home/Index"
}, "oidc");
}
[AllowAnonymous]
public IActionResult Logout()
{
return SignOut(new AuthenticationProperties
{
RedirectUri = "/Home/Index"
}, "Cookies.Mvc", "oidc");
}