用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

留文备用。第一个思路还有哪部分数据没有写对,留给以后解决吧。

最新文章

  1. Servlet编程
  2. Eclipse编程时的快捷键总结
  3. 大家一起和snailren学java-(13)字符串
  4. Flex 布局教程:语法篇(转)
  5. iso中第三方框架SDWebImage的使用步骤
  6. 开源日志库log4cplus+VS2008使用
  7. CSS——inline-block属性
  8. jQuery笔记(1)
  9. 201521123104《Java程序设计》第4周学习总结
  10. 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)
  11. Unity Socket UDP
  12. 【代码笔记】Web-CSS-CSS Text(文本)
  13. [学习] 从 函数式编程 到 lambda演算 到 函数的本质 到 组合子逻辑
  14. 解读tensorflow之rnn
  15. jq实现对checkbox的常用操作
  16. PHP7通过yum源安装及性能测试
  17. vue教程2-03 vue计算属性的使用 computed
  18. [转]关于docker包存储结构说明
  19. jsp的session完成登陆功能
  20. 在Team Foundation Server (TFS)的代码库或配置库中查找文件或代码

热门文章

  1. DVWA手记——取消登录
  2. IRGAN:A Minimax Game for Unifying Generative and Discriminative Information Retrieval Models
  3. Python 爬虫 解决escape问题
  4. HBase中多Filter查询示例
  5. iphone5刷机教程
  6. 全相FFT
  7. 全局获取 (Activity)Context,实现全局弹出 Dialog
  8. asp.net core中使用log4net
  9. ios 精简日历
  10. Xilinx vivado迅雷下载地址(所有版本)