更新用户的 X-XSRF 令牌错误
X-XSRF Token error for updated user
假设我的应用程序中有一个可以更改用户名的模块。由于用户名已更改,authcookie 应与 XSRF 令牌一起更新。
尝试此操作时,我收到一条错误消息 "The provided anti-forgery token was meant for user..."。好吧,我得到了一些关于如何解决这个问题的提示。由于当前的 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
吗?
我想在用户更新用户名后立即触发。
我们在更新用户详细信息的 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);
}
}
假设我的应用程序中有一个可以更改用户名的模块。由于用户名已更改,authcookie 应与 XSRF 令牌一起更新。
尝试此操作时,我收到一条错误消息 "The provided anti-forgery token was meant for user..."。好吧,我得到了一些关于如何解决这个问题的提示。由于当前的 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
吗?
我想在用户更新用户名后立即触发。
我们在更新用户详细信息的 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);
}
}