Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证Mvc4/WebAPI2中的ASP.NET Core Antiforgerytoken_C#_Asp.net_.net_Asp.net Core_Asp.net Web Api2 - Fatal编程技术网

C# 验证Mvc4/WebAPI2中的ASP.NET Core Antiforgerytoken

C# 验证Mvc4/WebAPI2中的ASP.NET Core Antiforgerytoken,c#,asp.net,.net,asp.net-core,asp.net-web-api2,C#,Asp.net,.net,Asp.net Core,Asp.net Web Api2,有人知道是否可以配置Mvc4/WebApi2应用程序来验证/解密ASP.NET Core生成的防伪令牌吗 我们希望能够从ASP.NET Core应用程序使用运行在同一域(子域)上的ASP.NET Core生成的AntiForgeryToken向WebApi2应用程序发出经过验证的请求 我相信(也可能是错误的,所以请纠正我)在正常的WebApi-->WebApi或ASP.NET Core-->ASP.NET Core场景下这是可能的,前提是两个应用程序都在同一个域下运行(因此可以访问cookie)

有人知道是否可以配置Mvc4/WebApi2应用程序来验证/解密ASP.NET Core生成的防伪令牌吗

我们希望能够从ASP.NET Core应用程序使用运行在同一域(子域)上的ASP.NET Core生成的AntiForgeryToken向WebApi2应用程序发出经过验证的请求

我相信(也可能是错误的,所以请纠正我)在正常的WebApi-->WebApi或ASP.NET Core-->ASP.NET Core场景下这是可能的,前提是两个应用程序都在同一个域下运行(因此可以访问cookie)。我似乎找不到有关如何执行此ASP.NET Core-->WebApi的说明

我们的ASP.NET核心应用程序通过以下方式设置了数据保护服务:

services.AddDataProtection().PersistKeySystem(“SomeDirectory”)

ASP.NET核心端有一个正常工作的AntiforgeryToken实现:
services.AddAntiforgery(options=>options.HeaderName=“X-XSRF-TOKEN”)

在Mvc4/WebApi2端,我们设置了一个
DataProtectorShim
,允许它能够在双方都可以操作的cookie中加密/解密OWIN

我们试图手动验证防伪令牌/cookie,但不出所料,它也无法解密(这是一次暗中尝试):

据我所知,它看起来像是
System.Web
Antifforgery
类不允许一个注入点,在这个注入点中,我们可以推入一个正确配置的数据保护器/垫片,并始终使用MachineKey序列化程序来进行解密。我知道
Microsoft.AspNetCore.Antiforgery
库,但不确定这是否有帮助

我们在这方面的失败尝试产生了:

无法解密防伪令牌。如果此应用程序由Web场或群集承载,请确保所有计算机都运行相同版本的ASP.NET网页,并且配置指定了显式加密和验证密钥。无法在群集中使用自动生成。

这很有意义,因为我们没有在ASP.NET核心端使用机器密钥进行加密


有人知道怎么设置吗?非常感谢您的指导。

您有没有想到这一点?我们有一个确切的场景给我们带来了一个问题…不-我认为这不现实。DPAPI和机器密钥是完全不同的实现,我后来了解到它们没有“桥梁”可谈。最终我们将所有内容迁移到ASP.NET核心。如果你在这方面有任何进展,我很想听听你的发现。对不起,我可以进一步帮你。谢谢你回复我,我还在努力想办法;)但我认为,如果没有iFrame或客户端PostBackshat(这是我的外卖),这是不可能实现的。我不太愿意说“不可能”,但我认为您必须使用DPAI实现自己的中间件解密处理程序。我猜您是对的,没有人这么做是有原因的。我无法让它工作。我试图用dotnet core和.NETMVC的混合以及proxykit管理流程将我的应用程序分成不同的部分。我们有一个登录模式,它无处不在,因此无法再使用。最简单的解决方案是重定向到dotnet核心应用程序,并让该应用程序处理登录。所有其他共享端点都被复制到每个应用程序,每个应用程序都可以处理自己的反伪造令牌/cookie。可惜这件事做不到。在Owin.Antiforgery中有一个实现,可以使用自定义中间件,但需要对其进行修改以处理数据保护…您有没有想过这一点?我们有一个确切的场景给我们带来了一个问题…不-我认为这不现实。DPAPI和机器密钥是完全不同的实现,我后来了解到它们没有“桥梁”可谈。最终我们将所有内容迁移到ASP.NET核心。如果你在这方面有任何进展,我很想听听你的发现。对不起,我可以进一步帮你。谢谢你回复我,我还在努力想办法;)但我认为,如果没有iFrame或客户端PostBackshat(这是我的外卖),这是不可能实现的。我不太愿意说“不可能”,但我认为您必须使用DPAI实现自己的中间件解密处理程序。我猜您是对的,没有人这么做是有原因的。我无法让它工作。我试图用dotnet core和.NETMVC的混合以及proxykit管理流程将我的应用程序分成不同的部分。我们有一个登录模式,它无处不在,因此无法再使用。最简单的解决方案是重定向到dotnet核心应用程序,并让该应用程序处理登录。所有其他共享端点都被复制到每个应用程序,每个应用程序都可以处理自己的反伪造令牌/cookie。可惜这件事做不到。在Owin.Antiforgery中有一个实现,可以使用自定义中间件,但需要对其进行修改以处理数据保护。。。。
  app.Use(next => context =>
     {
        var tokens = antiforgery.GetAndStoreTokens(context);

        context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,
                            new CookieOptions {HttpOnly = false});

        return next(context);
     });
AntiForgery.Validate(HttpContext.Current.Request.Cookies["XSRF-TOKEN"].Value, HttpContext.Current.Request.Headers["X-XSRF-TOKEN"]);