gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 3 为托管在一台本地服务器上的多门户应用程序提供防伪造保护

转载 作者:行者123 更新时间:2023-12-02 23:40:20 24 4
gpt4 key购买 nike

我有2个网站,实际上它们是相同的。目的是其中一个供互联网用户使用,第二个供本地使用。现在它们托管在我的本地主机上的同一 IIS 服务器上。当我打开这两个网站并尝试获取标有 [ValidateAntiForgeryToken] 的操作结果时,我遇到一个问题,在我的 cookie 中,我有本地主机站点的 cookie,并且有一个名为“RequestVerificationToken_Lw”的 cookie ”这是防伪保护 key 。问题在于两个站点都使用相同的 cookie 来存储此 key 。因此,如果在一个网站上执行某项操作,当我尝试在另一个网站上执行某项操作时,我会收到防伪错误。

如何更改 cookie 域或任何其他解决方案来分割 cookie?

谢谢!

最佳答案

好吧,让我们看看 ValidateAntiforgeryTokenAttribute 的作用(Reflector/ILSpy 是你的 friend ):

public void OnAuthorization(AuthorizationContext filterContext){    if (filterContext == null)    {        throw new ArgumentNullException("filterContext");    }    string antiForgeryTokenName = AntiForgeryData.GetAntiForgeryTokenName(null);    string antiForgeryTokenName2 = AntiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath);    HttpCookie httpCookie = filterContext.HttpContext.Request.Cookies[antiForgeryTokenName2];    if (httpCookie == null || string.IsNullOrEmpty(httpCookie.Value))    {        throw ValidateAntiForgeryTokenAttribute.CreateValidationException();    }    AntiForgeryData antiForgeryData = this.Serializer.Deserialize(httpCookie.Value);    string text = filterContext.HttpContext.Request.Form[antiForgeryTokenName];    if (string.IsNullOrEmpty(text))    {        throw ValidateAntiForgeryTokenAttribute.CreateValidationException();    }    AntiForgeryData antiForgeryData2 = this.Serializer.Deserialize(text);    if (!string.Equals(antiForgeryData.Value, antiForgeryData2.Value, StringComparison.Ordinal))    {        throw ValidateAntiForgeryTokenAttribute.CreateValidationException();    }    string username = AntiForgeryData.GetUsername(filterContext.HttpContext.User);    if (!string.Equals(antiForgeryData2.Username, username, StringComparison.OrdinalIgnoreCase))    {        throw ValidateAntiForgeryTokenAttribute.CreateValidationException();    }    if (!this.ValidateFormToken(antiForgeryData2))    {        throw ValidateAntiForgeryTokenAttribute.CreateValidationException();    }}

好吧,很明显, token 的 cookie 名称是根据应用程序路径创建的:

    string antiForgeryTokenName2 = AntiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath);    HttpCookie httpCookie = filterContext.HttpContext.Request.Cookies[antiForgeryTokenName2];

因此,您创建自己的过滤器,只需复制粘贴此代码,然后将其更改为也尊重端口(或通过您区分应用程序的任何内容):

    string antiForgeryTokenName2 = AntiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath  + filterContext.HttpContext.Request.Url.Port);    HttpCookie httpCookie = filterContext.HttpContext.Request.Cookies[antiForgeryTokenName2];

这样,cookie 名称(“RequestVerificationToken_Lw”)也会因端口而异。

当然,我们也不能忘记在创建 token 时更改此 cookie 名称。不幸的是,您需要在这里复制粘贴“重新实现”两件事 - 首先是 AntiForgeryToken 扩展方法来调用您自己的 AntiForgeryWorker,然后是 AntiForgeryWorker 本身 - 只需覆盖方法 GetAntiForgeryTokenAndSetCookie,它与之前的内容相同:

string antiForgeryTokenName = AntiForgeryData.GetAntiForgeryTokenName(httpContext.Request.ApplicationPath);

嗯,这看起来一团糟,而且绝对不是一个 DRY 解决方案,但如果你真的想要这个,你可以在几分钟内完成它。只需使用反射器和复制粘贴:)

关于asp.net-mvc - ASP.NET MVC 3 为托管在一台本地服务器上的多门户应用程序提供防伪造保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6828579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com