我们在 ASP.Net Core webapp 中使用简单的 cookie 身份验证。登录已经工作了将近3个月。然后突然,一个问题开始出现。
这就是我在 Startup.cs 中设置身份验证的方式:
private void ConfigureAuthentication(IServiceCollection services)
{
var configurationService = services.BuildServiceProvider().GetRequiredService<IConfigurationService>();
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options => {
options.LoginPath = "/Identity/Login";
options.AccessDeniedPath = "/Identity/AccessDenied";
options.ExpireTimeSpan = TimeSpan.FromMinutes(double.Parse(configurationService.Get("CookieTimeout").Result.Value));
options.LogoutPath = "/Identity/Logout";
});
services.AddAuthorization(options =>
{
options.AddPolicy("KeyUsers",
authBuilder =>
{
authBuilder.RequireRole("KeyUsers");
});
options.AddPolicy("Admins",
authBuilder =>
{
authBuilder.RequireRole("Admins");
});
options.AddPolicy("Users",
authBuilder =>
{
authBuilder.RequireRole("Users");
});
});
}
这是我实际登录的方式:
var role = await _roleRepository.Read(user.RoleId);
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.UserId.ToString()),
new Claim(ClaimTypes.Email, user.EmailAddress),
new Claim(ClaimTypes.Name, user.CWID),
new Claim(ClaimTypes.Role, role.Description)
};
ClaimsIdentity userIdentity = new ClaimsIdentity(claims, "login");
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
await httpContext.SignInAsync(principal);
_logger.LogInformation("A user with the following cwid entered the correct password: {0}", cwid);
user.FailedLoginAttempts = 0;
await _userRepository.Update(user);
return LoginResult.Successful;
所以基本上,在用户输入正确的凭据后,我使用上面的代码登录。然后应该将它们重定向到登录用户的登录页面。这已经正常工作了 2-3 个月,但现在,由于某种原因,当他们到达登录页面时,他们会立即再次重定向到登录页面,这意味着他们实际上并没有登录。奇怪的是,我只有这个问题在一个浏览器(新 Edge)上,当我使用另一个(Chrome)尝试它时,它可以工作。所以我认为在浏览器中设置身份验证cookie的方式一定有问题,但我不确定。有什么想法吗?