asp.Net   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了asp.net-mvc – 使用WebForm的MVC HtmlHelper大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_772_0@
我正在为混合WebForms / MVC网站添加一些UI功能。在这种情况下,我将一些AJAX UI功能添加到WebForms页面(通过jQuery),数据来自MVC JsonResult。一切都在100%工作,有一个例外:

我想实施XSRF保护AntiForgeryToken。我已经将它与我的纯MVC应用程序中的ValidateAntiForgeryToken属性结合使用,但想知道如何在WebForms中实现Html.AntiForgeryToken()方法。 Here’s an example using a UrlHelper

我正在让ViewContext / requestContext“嘲笑”正确的一些麻烦。如何在WebForms页面中使用HtmlHelpers?

编辑:
我正在从我的WebForms页面检索AntiForgeryToken,而不是从MVC JsonResult中检索。

解决方法

关键的方法是在MVC源代码中:GetAntiForgeryTokenAndSetCookie

这将创建一个称为AntiForgeryData的内部密封类的实例。

该实例被序列化为一个基于应用程序路径的64位编码版本的cookie“__requestVerificationToken_”。

相同的AntiForgeryData实例被序列化为隐藏的输入。

AntiForgeryData的唯一部分是使用RNGCryptoserviceProvider.GetBytes()

所有这一切都可能在WebForms页面中被欺骗,唯一的混乱是隐藏的类的序列化。不幸的是,关键的方法(GetAntiForgeryTokenAndSetCookiE)依赖于ViewContext.httpContext.request来获取cookie,而WebForm需要使用httpContext.Current.request。

更新

没有太多的测试和很多的代码,但我想我已经破解了一点反思。我使用反射的地方我已经离开了上面的等效线:

using System;
using System.Reflection;
using System.Web;
using System.Web.Mvc;

/// <sumMary>Utility to provide MVC anti forgery tokens in WebForms pages</sumMary>
public class WebFoRMANtiForgery
{
    /// <sumMary>Create an anti forgery token in a WebForms page</sumMary>
    /// <returns>The HTML input and sets the cookie</returns>
    public static String AntiForgeryToken()
    {
        String formValue = GetAntiForgeryTokenAndSetCookie();

        // String fieldName = AntiForgeryData.GetAntiForgeryTokenName(null);
        var mvCassembly = typeof(HtmlHelper).Assembly;
        var afdType = mvCassembly.GetType("System.Web.Mvc.AntiForgeryData");
        String fieldName = Convert.ToString(afdType.InvokeMember(
            "GetAntiForgeryTokenName",BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod,null,new object[] { null }));

        TagBuilder builder = new TagBuilder("input");
        builder.Attributes["type"] = "hidden";
        builder.Attributes["name"] = fieldName;
        builder.Attributes["value"] = formValue;
        return builder.ToString(tagRenderMode.SelfClosing);
    }

    static String GetAntiForgeryTokenAndSetCookie()
    {
        var mvCassembly = typeof(HtmlHelper).Assembly;
        var afdType = mvCassembly.GetType("System.Web.Mvc.AntiForgeryData");

        // new AntiForgeryDataserializer();
        var serializerType = mvCassembly.GetType("System.Web.Mvc.AntiForgeryDataserializer");
        var serializerCtor = serializerType.GetConstructor(new Type[0]);
        object serializer = serializerCtor.Invoke(new object[0]); 

        // String cookiename = AntiForgeryData.GetAntiForgeryTokenName(httpContext.Current.request.ApplicationPath);
        String cookiename = Convert.ToString(afdType.InvokeMember(
            "GetAntiForgeryTokenName",new object[] { httpContext.Current.request.ApplicationPath }));

        // AntiForgeryData cookieToken;
        object cookieToken;
        httpCookie cookie = httpContext.Current.request.Cookies[cookiename];
        if (cookie != null)
        {
            // cookieToken = serializer.Deserialize(cookie.value);
            cookieToken = serializerType.InvokeMember("Deserialize",BindingFlags.InvokeMethod,serializer,new object[] { cookie.Value });
        }
        else
        {
            // cookieToken = AntiForgeryData.NewToken();
            cookieToken = afdType.InvokeMember(
                "NewToken",BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod,new object[0]);

            // String cookieValue = serializer.serialize(cookieToken);
            String cookieValue = Convert.ToString(serializerType.InvokeMember("serialize",new object[] { cookieToken }));

            var newCookie = new httpCookie(cookiename,cookievalue) { httpOnly = true };

            httpContext.Current.Response.Cookies.Set(newCookiE);
        }

        // AntiForgeryData formToken = new AntiForgeryData(cookieToken)
        // {
        //     CreationDate = datetiR_785_11845@e.Now,//     Salt = salt
        // };
        var ctor = afdType.GetConstructor(new Type[] { afdType });
        object formToken = ctor.Invoke(new object[] { cookieToken });

        afdType.InvokeMember("CreationDate",BindingFlags.SetProperty,formToken,new object[] { datetiR_785_11845@e.Now });
        afdType.InvokeMember("Salt",new object[] { null });

        // String formValue = serializer.serialize(formToken);
        String formValue = Convert.ToString(serializerType.InvokeMember("serialize",new object[] { formToken }));
        return formValue;
    }
}

用法类似于MVC:

WebFoRMANtiForgery.AntiForgeryToken()

它创建与MVC方法相同的cookie和相同的HTML。

我没有用盐和域方法打扰,但它们相当容易添加。

大佬总结

以上是大佬教程为你收集整理的asp.net-mvc – 使用WebForm的MVC HtmlHelper全部内容,希望文章能够帮你解决asp.net-mvc – 使用WebForm的MVC HtmlHelper所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。