15.04.14-登录之后刷新AntiForgeryToken
用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的更多相关文章
- 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0
大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 N ...
- 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 ...
- 在虚拟机中安装Ubuntu Server 15.04
学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Li ...
- 在 Ubuntu 15.04 中使用 ubuntu-make、Eclipse 4.4、Java 8 以及 WTP
Ubuntu 今天发布新版本了 其实昨天(2015-04-23)我就看到了 Ubuntu 发布新版本的新闻,下班后回家的第一件事就是访问 Ubuntu 的官网,很可惜,没有提供下载.今天(2015-0 ...
- 如何在 Ubuntu 15.04 系统中安装 Logwatch
大家好,今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件,它也可以在各种 Linux 系统和类 Unix 系统上安装.Logwatch 是一款可定制的日志分析和日 ...
- Ubuntu 15.04 配置VPN的方法详解
源 起 不久前因为要更新AndroidSDK 和查找相关资料, 但有些方式不能墙了, 所以为了节约时间成本, 购买了为期一个月的VPN, 对方发来邮件, 提供了二十几个服务器地址, 以及一套自动生成 ...
- Ununtu 15.04 安装MySql(Django连接Mysql)
本文介绍Ubuntu 15.04下安装MySQL ubuntu 15.04安装mysql django项目连接mysql 一.安装数据库 1.sudo apt-get install mysql-se ...
- ubuntu各版本代号(更新至15.04)及各版本下载地址等
版本号 代号 发布时间 15.04 Vivid Vervet 2015/04/22 14.10 Utopic Unicorn 2014/10/23 14.04 LTS Trusty Tahr 2014 ...
- caffe学习笔记(1)安装 - Ubuntu 15.04
官方安装手册 备注:使用系统 - Ubuntu 15.04 64位操作系统(若系统位于虚拟机上,在安装CUDA后,Ubuntu将无法进入图形界面) /************************* ...
随机推荐
- keras 类似问题解决:model找不到,或者无法下载
Applications Keras Applications are deep learning models that are made available alongside pre-train ...
- Spring boot validation校验
使用 Hibernate validator 的步骤:1. 在 Pojo 类的字段上, 加上 Hibernate validator 注解2. 在Controller 函数的形参前加上 @Valid ...
- 清理kafka zookeeper
; ; /; rm -rf /app/zookeeper/logs/*; rm -rf /app/pet_kafka_emds2_cluster/kafka-logs/*; rm -rf /app/p ...
- Eclipse maven问题汇总
在使用eclipse+maven的过程中,遇到一系列问题,先汇总记录如下: 1. 在java工程中,缺少Maven依赖: 这个问题比较棘手,一般都对eclispe的工程结构不是很了解,后来经过长时间的 ...
- linux(centos6)搭建ftp服务器 -摘自网络
前提 ssh服务已经开启,关闭防火墙,主机和虚拟机能ping通 查看ssh和防火墙的状态 service sshd status service iptables status 开启ssh服务 ser ...
- 关于ansbile工具的shell、command、script、raw模块的区别和使用场景
command模块 [执行远程命令] [root@node1 ansible]# ansible testservers -m command -a 'uname -n' script模块 [在远程主 ...
- sqlite 判断表中是否包含 某个字段
数据库 都有一个 根表..(我的理解) 也就是 你创建了一个数据库 里面就带有 一个表 sqlite_master 字段有 type , name , tbl_name , rootpage ,sq ...
- POJ 1636 Prison rearrangement DFS+0/1背包
题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS Memor ...
- MySQL数据库优化详解(收藏)
MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * ...
- android笔记---主界面(一)
<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="htt ...