我有ASP核心2.1应用程序,与角SPA客户端一起工作。我像声明的这里一样保护我的应用程序。
但问题是,我经常收到400坏的请求后,我立即登录到系统。根据我的观点,这就是系统中发生的情况:
很明显,登录后我们需要重新发布AntiforgeryTokenSet,但我不知道在哪里和如何。我已经尝试在结果过滤器中发出令牌,但是没有运气。
public class SPAAntiforgeryCookieResultFilter : ResultFilterAttribute
{
private readonly IAntiforgery _antiforgery;
public SPAAntiforgeryCookieResultFilter(IAntiforgery antiforgery)
{
_antiforgery = antiforgery;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
Action assignAntiForgery = () =>
{
var tokens = _antiforgery.GetAndStoreTokens(context.HttpContext);
context.HttpContext.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });
};
if (context.Result is ViewResult)
{
assignAntiForgery();
}
else if (string.Equals(context.ActionDescriptor.ActionName, nameof(AccountController.Login), StringComparison.OrdinalIgnoreCase))
{
assignAntiForgery();
}
}
}
ResultExecutingContext似乎不了解经过身份验证的用户,并且仍然为匿名用户颁发令牌。那么,我们如何在登录后重新刷新经过身份验证的用户的防伪RequestToken令牌呢?
发布于 2018-07-20 06:15:41
现在,我找到了如何绕过这个问题的方法。
以前,我在成功登录后返回了Ok()
,但是现在我做了RedirectToAction()
,为了在RedirectToAction
发生后刷新令牌,我的OnResultExecuting
过滤器略有改变。
public class SPAAntiforgeryCookieResultFilter : ResultFilterAttribute
{
private readonly IAntiforgery _antiforgery;
public SPAAntiforgeryCookieResultFilter(IAntiforgery antiforgery)
{
_antiforgery = antiforgery;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
Action assignAntiForgery = () =>
{
var tokens = _antiforgery.GetAndStoreTokens(context.HttpContext);
context.HttpContext.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });
};
if (context.Result is ViewResult)
{
assignAntiForgery();
}
// Here we check whether our redirect action is executed. Update AFT if it is
else if (string.Equals(context.ActionDescriptor.RouteValues["action"], nameof(AccountController.RefreshAntiForgeryAfterLogin), StringComparison.OrdinalIgnoreCase))
{
assignAntiForgery();
}
}
}
这个肮脏的黑客在下一种方式下起作用:
User.IsAuthenticated == true
)的上下文联系我们的RedirectUserToAction
方法。https://stackoverflow.com/questions/51442720
复制相似问题