asp.net-mvc – AntiForgeryToken登录后无效
|
我有一张表格,用户可以在没有登录的情况下发布.但是,如果他的电子邮件被识别,则需要密码.密码表格通过Ajax进行验证,如果成功提交主表单.两种形式都需要有效的AntiForgeryToken. 捕获是,作为双产品的密码检查也会对用户进行签名(来自客户端的要求).这使令牌无效,主表单无法发送. 我已经以编程方式生成了一个新的令牌,但是我无法让它工作. 关于如何解决这个问题的任何想法? 最终解决方案 我发现this的问题有助于打造反思.然而,这正是在正常情况下,您将避免黑客内部类型的主要原因,这些类型是在版本之间的程序集之间进行的.贝蒂建议,使用ILSpy来查找东西. 这是最终的代码. if (signIn)
FormsAuth.SignIn(user.Email,false);
var mvcAssembly = typeof(AntiForgery).Assembly;
var afdType = mvcAssembly.GetType("System.Web.Helpers.AntiForgeryData");
string fieldName = Convert.ToString(afdType.InvokeMember(
"GetAntiForgeryTokenName",BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod,null,new object[] { null }));
var serializerType = mvcAssembly.GetType("System.Web.Helpers.AntiForgeryDataSerializer");
var serializerCtor = serializerType.GetConstructor(new Type[0]);
object serializer = serializerCtor.Invoke(new object[0]);
string text = HttpContext.Request.Form[fieldName];
object antiForgeryData = serializerType.InvokeMember("Deserialize",BindingFlags.InvokeMethod,serializer,new object[] { text });
afdType.GetProperty("Username").SetValue(antiForgeryData,signIn ? user.Email : string.Empty,null);
string newToken = Convert.ToString(serializerType.InvokeMember(
"Serialize",new object[] { antiForgeryData }));
return Content(JsonConvert.SerializeObject(new
{
success = true,newAntiForgeryToken = newToken
}),Constant.JsonContentType);
升级为WebPages 2.0 var mvcAssembly = typeof(AntiForgery).Assembly;
var afdType = mvcAssembly.GetType("System.Web.Helpers.AntiXsrf.AntiForgeryToken");
//string fieldName = Convert.ToString(afdType.InvokeMember(
// "GetAntiForgeryTokenName",// BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod,// null,// new object[] { null }));
string fieldName = "__RequestVerificationToken";
var serializerType = mvcAssembly.GetType("System.Web.Helpers.AntiXsrf.AntiForgeryTokenSerializer");
var serializerCtor = serializerType.GetConstructor(new Type[0]);
object serializer = serializerCtor.Invoke(new object[0]);
string text = HttpContext.Request.Form[fieldName];
string newToken = String.Empty;
if (!String.IsNullOrEmpty(text))
{
object antiForgeryToken = serializerType.InvokeMember("Deserialize",new object[] { text });
afdType.GetProperty("Username").SetValue(antiForgeryToken,null);
newToken = Convert.ToString(serializerType.InvokeMember(
"Serialize",new[] { antiForgeryToken }));
}
解决方法当前用户以表单数据存储在防伪令牌中,并与回覆时的当前用户进行比较.您应该能够以与Phil Haack在this post中相同的方式在回发时拉出表单令牌. 然后使用AntiForgeryDataSerializer类对令牌进行反序列化,更新当前用户,将其重新序列化,并在检查之前将其放回表单中.或者使用您自己的属性来完全替换验证方法. 或者,而不是在主窗体回发上更新它,您可以尝试使用密码ajax请求发送更新的令牌并更新表单.无论哪种方式,基本方法是一样的,反序列化,更新用户,序列化,替换令牌. string antiForgeryTokenName = AntiForgeryData.GetAntiForgeryTokenName(null); string text = context.Request.Form[antiForgeryTokenName]; AntiForgeryDataSerializer serializer = new AntiForgeryDataSerializer(); AntiForgeryData antiForgeryData = serializer.Deserialize(text); antiForgeryData.Username = AntiForgeryData.GetUsername(context.User); string newToken = serializer.Serialize(antiForgeryData); AntiForgeryDataSerializer和AntiForgeryData是内部类,所以你必须使用一些基本的反射来调用它们的方法. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 为什么IIS线程这么珍贵与常规CLR线程相比?
- .net – 何时设置HttpContext.User.Identity?
- asp.net-mvc – MVC WebApi不使用AutofacWebApiDependencyR
- asp.net-mvc – 建立与SQL Server的连接时发生网络相关或特
- asp.net-web-api – 如何创建角色并将用户添加到ASP.NET MV
- asp.net 读取并修改config文件实现代码
- 如何最小化ASP.NET C#项目DLL大小?
- asp.net-mvc – asp.net mvc 3 – ajax表单提交和验证
- asp.net-mvc – 在ASP.NET MVC中实现工作单元的方法
- asp.net vb用户控件在调用页面上引发一个事件
- asp.net – 如何将网页添加到gridview
- asp-classic – 如何在经典ASP中遍历集合?
- asp.net-mvc – MVC3部署依赖问题
- asp.net-mvc-3 – mvc dropdownlistfor没有标记为
- asp.net – __doPostBack在DotNetNuke网站上未定
- asp.net – 我可以在一个Web项目中拥有多个web.c
- ASP.NET推送重定向会话超时
- 高性能ASP.NET站点( 1000请求/秒)
- asp.net-mvc – 为FileResult设置ETag – MVC 3
- asp.net-mvc – 使用ASP.NET MVC 3.0进行日期验证
