假设我的应用中有一个可以更改用户名的模块。由于用户名已更改,因此authcookie应与XSRF令牌一起更新。
尝试此操作后,我收到一条错误消息"提供的防伪令牌适用于用户......"。好吧,我得到了一些如何解决这个问题的提示。由于当前的XSRF令牌是旧用户名而不是更新的用户名,因此出现此错误。
查看Global.asax代码,用户名的更改只会反映在Application_AuthenticateRequest
上。我还修改了Application_PostAuthenticateRequest
以强制在更新的用户名上创建新的XSRF令牌,如果在验证时,它将遇到相同的错误。
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
var existingXsrfCookie = Request.Cookies["XSRF-TOKEN"];
// logic for parsing XSRF-TOKEN
try
{
...more logic
AntiForgery.Validate(currentCookieToken, currentFormToken);
return;
}
catch (Exception ex)
{
Logger.ErrorException(ex.Message, ex);
}
// logic for creating new XSRF token
}
现在我真正的问题是,我可以从服务器端的Global.asax以外的地方触发Application_AuthenticateRequest
和Application_PostAuthenticateRequest
吗?
我希望在用户更新用户名后立即触发。
答案 0 :(得分:0)
我们在更新了用户详细信息的api调用上附加了onExecuted操作过滤器。由于XSRF令牌是从HTTPContext.Current生成的,因此我们更新了Thread.CurrentPrincipal以反映更新的详细信息。
[AntiForgeryUpdate]
[HttpPost]
public async Task<EditUserResponse> editUser (EditUserRequest request)
{
try
{
//code for updating user
var principal = Request.GetRequestContext().Principal;
var identity = principal.Identity;
identity.IdentityInfo = changedUser;
}
catch(Exception ex)
{
throw;
}
}
public class AntiForgeryUpdate: ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Request.Method != HttpMethod.Get)
{
AntiForgery.GetTokens(null, out string cookieToken, out string formToken);
var token = cookieToken + ":" + formToken;
actionExecutedContext.Response.Headers.AddCookies("XSRF-TOKEN", token);
}
base.OnActionExecuted(actionExecutedContext);
}
}