【发布时间】:2020-02-29 00:19:53
【问题描述】:
在一个基于 cookie 授权的 asp.net core 3.1 web 应用程序中,我创建了一个自定义验证器,它在 cookie 授权的 OnValidatePrincipal 事件上执行。验证器会做一些事情,其中之一是在用户被阻止时检查后端。如果用户已被阻止,则执行 CookieValidatePrincipalContext.RejectPrincipal() 方法并使用 CookieValidatePrincipalContext.HttpContext.SignOutAsyn(...) 方法注销用户,根据 MS 文档。
这里是验证器的相关代码:
public static async Task ValidateAsync(CookieValidatePrincipalContext cookieValidatePrincipalContext)
{
var userPrincipal = cookieValidatePrincipalContext.Principal;
var userService = cookieValidatePrincipalContext.GetUserService();
var databaseUser = await userService.GetUserBySidAsync(userPrincipal.GetSidAsByteArray());
if (IsUserInvalidOrBlocked(databaseUser))
{
await RejectUser(cookieValidatePrincipalContext);
return;
}
else if (IsUserPrincipalOutdated(userPrincipal, databaseUser))
{
var updatedUserPrincipal = await CreateUpdatedUserPrincipal(userPrincipal, userService);
cookieValidatePrincipalContext.ReplacePrincipal(updatedUserPrincipal);
cookieValidatePrincipalContext.ShouldRenew = true;
}
}
private static bool IsUserInvalidOrBlocked(User user)
=> user is null || user.IsBlocked;
private static async Task RejectUser(CookieValidatePrincipalContext context)
{
context.RejectPrincipal();
await context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
以下是基于 cookie 的授权设置:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(co =>
{
co.LoginPath = @$"/{ControllerHelpers.GetControllerName<AuthenticationController>()}/{nameof(AuthenticationController.Login)}";
co.LogoutPath = @$"/{ControllerHelpers.GetControllerName<AuthenticationController>()}/{nameof(AuthenticationController.Logout)}";
co.ExpireTimeSpan = TimeSpan.FromDays(30);
co.Cookie.SameSite = SameSiteMode.Strict;
co.Cookie.Name = "GioBQADashboard";
co.Events = new CookieAuthenticationEvents
{
OnValidatePrincipal = UserPrincipalValidator.ValidateAsync
};
co.Validate();
});
这实际上会按预期被调用和执行,并在用户被阻止后导航到新页面时将用户重定向到登录页面。
大多数视图都有对每 10 秒在计时器上执行的 api 方法的 ajax 调用。对于这些调用,凭据也会得到验证,并且用户会被注销。但是,在用户退出后,页面上会出现一个询问用户凭据的弹出窗口:
如果用户没有输入他们的凭据并导航到另一个页面,他们会按预期被带到登录页面。 如果他们确实输入了他们的凭据,他们会保持登录状态,但他们的身份似乎是他们的 Windows 身份...... 这里发生了什么?我真正想要实现的是,用户在退出后提出的任何请求都会被带到登录页面。
我显然错误地配置了一些东西,因此基于 cookie 的授权对于 ajax 请求不能正常工作,但我无法弄清楚它是什么。 还是 Authorization 属性没有按我预期的方式工作?
【问题讨论】:
标签: asp.net-mvc authentication asp.net-core cookies