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[1].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("帐号或密码错误!");
    }
});

本来思路应该是没什么问题,但是实际调试时,仍然报错:

提供的防伪标记适用于用户“[email protected]”,但当前用户为“”

这个思路暂时放下。

2. 登录验证完成之后,单独从服务器获取一次Token。也就是说把登录和更新Token分作两个步骤。

Controller:

public int FloatLogin(string userName, string psd)
{
    var success = true;//伪代码,这里验证身份
    var res = success ? 1 : 0;
}

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[1].Value;
    return newToken;
}

View:

$.post("/Account/FloatLogin", { userID: user, pwd: pwd }, function (res) {
    if (res == 1) {
        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

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

时间: 2024-10-30 18:03:53

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 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 Node.js 封装了4.5 版本的 Google V8 JS 引擎,与当前的 Chrome 所带的一致.所以,紧跟 V8 的发布可以让 Node.js 运行的更快.更安全,同时更好的利用 ES6 的很多语言特性. Node.js 4.0 发布的主要目标是为 io.js 用户提供一个简单的升级途径,所

Kubuntu 15.04 SDDM 使用root用户登录

kubuntu 15.04 开始用sddm来替代kdm,登录的时候要用root用户登录? Easy!!! ~#cat /etc/sddm.conf  [Autologin] Relogin=false Session= User= [General] HaltCommand= RebootCommand= [Theme] CursorTheme=breeze_cursors [Users] HideShells=/sbin/nologin,/bin/false # Hidden users, t

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

catalog 0. 引言 1. Description 2. Effected Scope 3. Exploit Analysis 4. Principle Of Vulnerability 5. Patch Fix 0. 引言 新技术.高性能技术的不断发展,越来越提升了操作系统的能力,而近几年出现的虚拟化技术,包括overlayfs虚拟层叠文件系统技术,则为docker这样的虚拟化方案提供了越来越强大的技术支撑,但是也同时带来了很多的安全问题抛开传统的overflow溢出型漏洞不说,还有另一

在虚拟机中安装Ubuntu Server 15.04

学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Linux技巧 Linux命令 Ubuntu系统 Linux服务器 Linux数据库 Linux开发 您的位置: Linux系统教程 > Ubuntu系统 > 在虚拟机中安装Ubuntu Server 15.04 时间:2015-06-13来源:blgpl.blog.51cto.com 作者:XIAO

如何在 Ubuntu 15.04 系统中安装 Logwatch

大家好,今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件,它也可以在各种 Linux 系统和类 Unix 系统上安装.Logwatch 是一款可定制的日志分析和日志监控报告生成系统,它可以根据一段时间的日志文件生成您所希望关注的详细报告.它具有易安装.易配置.可审查等特性,同时对其提供的数据的安全性上也有一些保障措施.Logwatch 会扫描重要的操作系统组件像 SSH.网站服务等的日志文件,然后生成用户所关心的有价值的条目汇总报告. 预安装设置 我们会使用

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

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

Ubuntu 15.04 + CUDA7.5 + Caffe 配置笔记

Ubuntu 15.04 + CUDA7.5 + Caffe 配置笔记 一.Ubuntu 安装 安装Ubuntu 15.04x64 + Win7x64 双系统,让二者在启动引导上相互隔离, 删除Ubuntu时不至Win7躺枪,就必须讲究安装方法. 最最最简单的就是使用EasyBCD安装.这可以将Ubuntu的启动引导Grub2安装在其自己的boot分区,而Win7的启动引导则安装在C盘或其保留分区,相互不干扰,不存在用Ubuntu引导Win7启动的问题. 这个策略非常干净,不存在安装完Win7可

图片展示 Ubuntu Desktop Next 15.04 的 Unity 8 进展

下载了一个UbuntuDesktop Next 15.04 镜像,做了一个 USB 启动盘,看看 Unity 8 的进展情况,进入界面,我想有很多人已经看过了,有线网络连接的问题在新版本中已经解决,但是没有显示出来,如果想设置一个静态IP就没有办法了,也许是 我没有找到,不过也太隐秘了. 系统因为还不完善所以还存在很多问题,先列举几条: 整个界面还是适用于手机或者平板移动设备,因为操作系统上完全是触摸屏操作习惯: 另外 Ubuntu 软件市场和音乐播放器的搜索还无法输入字符:打不开视频播放器:

利用qmake来为15.04及以上target创建Ubuntu应用项目

我们知道qmake是Qt最原生的跨平台编译工具.由于一些原因,在Ubuntu手机14.10上,广泛使用CMake以跨不同平台.事实上,在Qt Creator上,如果我们使用qmake,我们可以更加方便地管理我们的项目.比如: -我们可以在项目中使用点击右鼠标键来添加或删除文件.在CMake项目中,我们只能进行添加的动作 -在新的模版中加入了使用"main()"的入口,这样可以很方便地让我们的项目编译成为binary.对那些希望把自己的代码进行保护的开发者来说,这无疑是个好的方案 -对文