asp.net-mvc – MVC3 AntiForgeryToken打破了Ajax登录
ASP.NET MVC的AntiForgeryToken机制基于当前的HttpContext.User.当您调用
Html.AntiForgeryToken()时,它使用该值来构造令牌.基本上没问题(参见
last paragraph here中的解释)但是当您通过Ajax调用登录时会出现问题.
在我的代码中,当用户登录时,凭据作为Ajax中的Json对象发送(AntiForgeryToken隐藏字段值也在Json内发送),服务器验证用户,应用FormsAuthentication.SetAuthCookie(),并返回Json结果,包含一些用户特定的数据.这样,我可以在登录时避免整页刷新. 问题是,对服务器的每个后续Ajax请求现在都在ValidateAntiForgeryTokenAttribute上失败,因为它现在需要一个与防伪cookie不兼容的防伪标记. 如何将有效的防伪令牌放入客户端的隐藏字段中,以便登录后的每个Json请求都会成功? 我试图手动获取一个新的隐藏字段标记(在动作上使用AntiForgery.GetHtml(),提取标记字符串本身,将其返回到Json中的客户端并在JavaScript中手动将其置于防伪隐藏字段中)但是它不起作用 – 后续的Ajax调用在服务器上的ValidateAntiForgeryTokenAttribute上失败. 我还尝试设置HttpContext.User = new GenericPrincipal(new GenericIdentity(email),null);详见here,但它不起作用. 注意:This solution对我不起作用,因为我的具体情况:Ajax登录更改了服务器上的用户身份,因此登录前生成的每个令牌都无效; this solution也不适用,因为它解决了另一个问题. 解决方法
您需要清除并重做登录时的任何现有表单令牌.这意味着您的登录代码必须刷新当前页面(有点杀死它的ajax部分),您自己的令牌实现,或者您需要刷新令牌.可以请求部分视图,提取令牌和更新表单.你实际上可以有一个restful url,它只向经过身份验证的用户返回一个令牌.有人可能会说这是一个安全问题,但我不相信,因为它只是一种获取令牌的简单方法,而不是请求任何视图 – 部分或其他方式.
您应该能够通过以下方式轻松获取要替换的令牌实例: var token = $('input[name=""__RequestVerificationToken""]'); 编辑 如果用户没有登录,为什么你会在表单上有一个令牌.你允许在没有登录和登录的情况下“操作”相同的表单?即使在这种情况下网络上的大多数网站都将重定向登录.我理解正确吗?如果是这样,您可能需要考虑在此处跳过令牌或对未经身份验证的用户使用第二种类型的令牌.我相信你说的是一个未经身份验证的用户已经可以在应用程序中提交一些内容 – 如果我理解正确的话 – 再次进行身份验证. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Asp.NET中黑客会话变量
- asp.net – 实体框架第一次加载速度很慢
- 详解ASP.NET Core 中的框架级依赖注入
- ASP.NET MVC EF 连接数据库(二)-----Model First
- asp.net – 如何从c#调用javascript函数
- asp.net 中用easyui中的treegird的简单使用
- ASP.NET MVC在javascript中使用ViewData
- asp.net – 带有requireSSL for cookies的Sitecore
- asp.net – 如何使用Html.ActionLink在标记中添加span标记
- 如何在ASP.NET按钮中使用Twitter Bootstrap图标?
- asp.net-mvc – ASP.NET MVC路由两个GUID
- asp.net – 如何将转发器中Item的客户端ID传递给
- asp.net-mvc – 在Windows Creators Update之后,
- 加载ASP.Net MVC JSONResult jQuery DataTables
- ASP.NET Core根据环境切换NLog配置
- Asp.net mvc 知多少(六)
- asp.net-mvc-3 – IIS中缺少UrlRoutingModule
- 如何将ASP.NET用户控件转换为Web /复合控件?
- asp.net-core – 如何在MVC Visual Studio 2015中
- ASP.net MVC 4是否有一些标准化的方式来引用Java