情景:
某页面未登录下可以访问,但具体操作时发现未登录就弹出登录窗,待完成登录后继续操作。
当登录成功,前端继续操作(post后端接口)时发现以下错误:
提供的防伪标记适用于用户“”,但当前用户为“XX”。
(登录以及具体页面操作都是ajax post)
看到这个错误后先是这么处理:
//登录代码。。。
string
oldCtoken = HttpContext.Request.Cookies[
"__RequestVerificationToken"
].Value;
string
ctoken;
string
ftoken;
AntiForgery
.GetTokens(oldCtoken,
out
ctoken,
out
ftoken);
//生成新token
HttpContext.Request.Cookies.Set(
new
HttpCookie
(
"__RequestVerificationToken"
, ctoken));
return
Content(ftoken); //返回,前端收到后设置 hidden token
但是发现虽然使用了新的cookie token 、 form token ,但是还是提示用户不对。
接着研究源码。。。通过研究源码发现:生成token的时候 会取当前用户identity。 (之前有遇到登录后,identity 不会刷新,所以解决方案很明显了)
string
[] roles =
new
string
[] {
"Role1"
,
"Role2"
}; //具体情况设置
HttpContext.User =
new
GenericPrincipal
(
new
GenericIdentity
(
"XX"
), roles); //用户名具体设置
//这样也是可以的
//ftoken = AntiForgery.GetHtml().ToString();
//Regex r = new Regex(@"value=""([^""]+)");
//var m = r.Match(ftoken);
//return Content(m.Groups[1].Value);