用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

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

15.04.14-登录之后刷新AntiForgeryToken的更多相关文章

  1. 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0

    大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 N ...

  2. CVE-2015-1328 Ubuntu 12.04, 14.04, 14.10, 15.04 overlayfs Local Root

    catalog . 引言 . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch ...

  3. 在虚拟机中安装Ubuntu Server 15.04

    学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Li ...

  4. 在 Ubuntu 15.04 中使用 ubuntu-make、Eclipse 4.4、Java 8 以及 WTP

    Ubuntu 今天发布新版本了 其实昨天(2015-04-23)我就看到了 Ubuntu 发布新版本的新闻,下班后回家的第一件事就是访问 Ubuntu 的官网,很可惜,没有提供下载.今天(2015-0 ...

  5. 如何在 Ubuntu 15.04 系统中安装 Logwatch

    大家好,今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件,它也可以在各种 Linux 系统和类 Unix 系统上安装.Logwatch 是一款可定制的日志分析和日 ...

  6. Ubuntu 15.04 配置VPN的方法详解

    源 起 不久前因为要更新AndroidSDK 和查找相关资料, 但有些方式不能墙了, 所以为了节约时间成本, 购买了为期一个月的VPN,  对方发来邮件, 提供了二十几个服务器地址, 以及一套自动生成 ...

  7. Ununtu 15.04 安装MySql(Django连接Mysql)

    本文介绍Ubuntu 15.04下安装MySQL ubuntu 15.04安装mysql django项目连接mysql 一.安装数据库 1.sudo apt-get install mysql-se ...

  8. ubuntu各版本代号(更新至15.04)及各版本下载地址等

    版本号 代号 发布时间 15.04 Vivid Vervet 2015/04/22 14.10 Utopic Unicorn 2014/10/23 14.04 LTS Trusty Tahr 2014 ...

  9. caffe学习笔记(1)安装 - Ubuntu 15.04

    官方安装手册 备注:使用系统 - Ubuntu 15.04 64位操作系统(若系统位于虚拟机上,在安装CUDA后,Ubuntu将无法进入图形界面) /************************* ...

随机推荐

  1. keras 类似问题解决:model找不到,或者无法下载

    Applications Keras Applications are deep learning models that are made available alongside pre-train ...

  2. Spring boot validation校验

    使用 Hibernate validator 的步骤:1. 在 Pojo 类的字段上, 加上 Hibernate validator 注解2. 在Controller 函数的形参前加上 @Valid ...

  3. 清理kafka zookeeper

    ; ; /; rm -rf /app/zookeeper/logs/*; rm -rf /app/pet_kafka_emds2_cluster/kafka-logs/*; rm -rf /app/p ...

  4. Eclipse maven问题汇总

    在使用eclipse+maven的过程中,遇到一系列问题,先汇总记录如下: 1. 在java工程中,缺少Maven依赖: 这个问题比较棘手,一般都对eclispe的工程结构不是很了解,后来经过长时间的 ...

  5. linux(centos6)搭建ftp服务器 -摘自网络

    前提 ssh服务已经开启,关闭防火墙,主机和虚拟机能ping通 查看ssh和防火墙的状态 service sshd status service iptables status 开启ssh服务 ser ...

  6. 关于ansbile工具的shell、command、script、raw模块的区别和使用场景

    command模块 [执行远程命令] [root@node1 ansible]# ansible testservers -m command -a 'uname -n' script模块 [在远程主 ...

  7. sqlite 判断表中是否包含 某个字段

    数据库 都有一个 根表..(我的理解) 也就是 你创建了一个数据库 里面就带有 一个表 sqlite_master 字段有 type , name  , tbl_name , rootpage ,sq ...

  8. POJ 1636 Prison rearrangement DFS+0/1背包

    题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS   Memor ...

  9. MySQL数据库优化详解(收藏)

    MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * ...

  10. android笔记---主界面(一)

    <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="htt ...