2021-03-29 乐帮网
iis netcore
ASP.Net Core 的Razor Pages项目或者其它Web项目,直接在页面上使用Post方法提交页面发现报错:400 Bad Request。在Visual Studio中直接运行则没有问题。看着是一起小事故,实则里面的问题太多了。首先引起这个的原因是起源于antiforgery加密。Net Core项目在使用Form表单提交时默认使用AntiForgeryToken, 这是处理/预防CSRF的一种处理方案,CSRF(Cross-site request forgery)是跨站请求伪造,也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。简单说就是:有人盗用了你的身份,并且用你的名义发送恶意请求。
那为什么在IIS中部署会有问题呢?在默认情况下是没有问题,这个过程中需要用到一个machine key,也就是一个机器有一个唯一的码,通过它来进行信息加密。在IIS部署的进程中是从config中取到这个machine key的。但是当我们的net Core需要部署到linux 或者不依靠iis时,这个加密的key值就需要额外生成并且告诉应用程序。ConfigureServices(IServiceCollection services) 方法中一般我们使用了如下代码:
var keysFolder = Path.Combine(AppContext.BaseDirectory, "web-temp-keys");
var dataProtectionBuilder = services.AddDataProtection()
.SetApplicationName("vkt_fman_web")
.PersistKeysToFileSystem(new DirectoryInfo(keysFolder))
.SetDefaultKeyLifetime(TimeSpan.FromDays(14));
经过这样的处理,确实可行,在linux中再使用Net Core程序没有问题。但是在IIS中又引发了新问题。这个加密的key值在iis中是取不到的,默认IIS有着自己的规则,它一般储存在%LOCALAPPDATA%\ASP.NET\DataProtection-Keys。这就引发了问题,那我们怎么处理呢?有两个方法:
(1)取消默认的AntiForgeryToken机制。
我们只需要在控制器添加标签属性[IgnoreAntiforgeryToken] 就可以,例如我们的一个 ASP.Net Core Razor Pages 项目的控制器如下:
[IgnoreAntiforgeryToken]
public class IndexModel : PageModel
{
public void OnGet()
{
}
public void OnPost(string name)
{
}
}
这样的话就不会再验证AntiForgeryToken了,但是默认表单提交还是有这个参数的,看着有点不爽,可以通过如下方式去掉。
<form asp-antiforgery="false" method="post" >
<input type="text" maxlength="6" name="name" placeholder="名称" />
<button type="submit">提交</button>
</form>
不过这不是我们的初衷,可有更好的解决方案。
(2)通过判断宿主进程来动态初始化
思路就是判断出iis然后区别对待,核心代码如下:
string hostName = Process.GetCurrentProcess().ProcessName.ToLower();
if (hostName!= "w3wp")
{
var keysFolder = Path.Combine(AppContext.BaseDirectory, "web-temp-keys");
var dataProtectionBuilder = services.AddDataProtection()
.SetApplicationName("vkt_fman_web")
.PersistKeysToFileSystem(new DirectoryInfo(keysFolder))
.SetDefaultKeyLifetime(TimeSpan.FromDays(14));
}
我做了一个demo,里面同时包含web.config文件,可以直接在IIS里设置应用程序 。部署过程参考:https://lebang2020.cn/details/210322njnautk1.html
你可以看最下方按钮来查看提取码。
链接:https://pan.baidu.com/s/1WnmbEt6FV8MbasKgiT1lMg
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力