15.04.14-登录之后刷新AntiForgeryToken
2024-09-18 05:54:09
用MVC做网站的时候,碰到这样一种情况:
用户可以匿名访问某页面A,页面可以填写,然后保存数据。访问可以匿名,但是提交的时候会提示登录,然后用户登录之后才能保存。
这里面的问题
1. 用户匿名访问页面A
2. 为提交的表单生成antiforgery token,token中的userName为空
3. 用ajax登录
4. 用户提交表单到服务器,但token验证失败。因为当前的token中的userName为空,与已经登录的userName不匹配。
报错内容:
提供的防伪标记适用于其他基于声明的用户,而不适用于当前用户
解决思路:
1.登录验证成功之后,在后台重新生成有效的token并传递到前台,然后前台更新token。
Controller:
//todo:登录验证,成功后执行下面
string[] roles = new string[] { }; //具体情况设置
HttpContext.User = new GenericPrincipal(new GenericIdentity(userName), roles); //用户名具体设置 var ftoken = System.Web.Helpers.AntiForgery.GetHtml().ToString();
System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"value=""([^""]+)");
var m = r.Match(ftoken);
var newToken = m.Groups[].Value;
return Json(new { Success = true, Token = newToken }, JsonRequestBehavior.AllowGet);
View:
$.post("/Account/FloatLogin", { userID: user, pwd: pwd }, function (res) {
if (res.Success) {
closeDialog();
$("#formID input[name='__RequestVerificationToken']").val(res.Token);
$("#formID").submit();
}
else {
alert("帐号或密码错误!");
}
});
本来思路应该是没什么问题,但是实际调试时,仍然报错:
提供的防伪标记适用于用户“admin@example.com”,但当前用户为“”
这个思路暂时放下。
2. 登录验证完成之后,单独从服务器获取一次Token。也就是说把登录和更新Token分作两个步骤。
Controller:
public int FloatLogin(string userName, string psd)
{
var success = true;//伪代码,这里验证身份
var res = success ? : ;
} public string RefreshToken()
{
var ftoken = System.Web.Helpers.AntiForgery.GetHtml().ToString();
System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"value=""([^""]+)");
var m = r.Match(ftoken);
var newToken = m.Groups[].Value;
return newToken;
}
View:
$.post("/Account/FloatLogin", { userID: user, pwd: pwd }, function (res) {
if (res == ) {
closeDialog();
$.get('/Account/RefreshToken', function (newToken) {
$("#formID input[name='__RequestVerificationToken']").val(newToken);
$("#formID").submit();
});
}
else {
alert("帐号或密码错误!");
}
});
这个思路解决了实际的问题。
参考文档:
http://stackoverflow.com/questions/16815634/reload-antiforgerytoken-after-a-login
http://www.cnblogs.com/jiangzhen/p/3870925.html
http://www.4byte.cn/question/735751/reload-antiforgerytoken-after-a-login.html
留文备用。第一个思路还有哪部分数据没有写对,留给以后解决吧。
最新文章
- Servlet编程
- Eclipse编程时的快捷键总结
- 大家一起和snailren学java-(13)字符串
- Flex 布局教程:语法篇(转)
- iso中第三方框架SDWebImage的使用步骤
- 开源日志库log4cplus+VS2008使用
- CSS——inline-block属性
- jQuery笔记(1)
- 201521123104《Java程序设计》第4周学习总结
- 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)
- Unity Socket UDP
- 【代码笔记】Web-CSS-CSS Text(文本)
- [学习] 从 函数式编程 到 lambda演算 到 函数的本质 到 组合子逻辑
- 解读tensorflow之rnn
- jq实现对checkbox的常用操作
- PHP7通过yum源安装及性能测试
- vue教程2-03 vue计算属性的使用 computed
- [转]关于docker包存储结构说明
- jsp的session完成登陆功能
- 在Team Foundation Server (TFS)的代码库或配置库中查找文件或代码