node.js - IISNode 使用 httpErrors="Passthrough" 关闭自定义错误不起作用
问题描述
我正在使用中间件模块来验证 JWT 令牌。当我尝试将状态代码设置为 401 或 403 时,我要么得到内置的 IIS 错误 HTML,要么将 httpErrors 设置为“Passthrough”。我假设如果我使用 404 或 500 也会遇到同样的问题。当我在 ASP.NET MVC 中使用不同的 API 时尝试设置状态代码并返回 JSON 时,我遇到了类似的问题。我用这篇文章来帮助我做对了:https ://weblog.west-wind.com/posts/2017/jun/01/bypassing-iis-error-messages-in-aspnet. 问题是从运行 IIS 的本地计算机上运行相同的代码时我没有问题。这与我要部署到的服务器或 IIS 的配置方式有关。我还需要在 IIS 中做些什么才能使其正常工作吗?我将它作为 IIS 中的应用程序/虚拟目录运行是否重要?
这是JS代码:
const aad = require('azure-ad-jwt');
module.exports = (req, res, next) => {
console.log('authorizing');
if(!req.headers.authorization){
res.status(403).json({
message: "Auth failed"
});
return;
}
const jwtToken = req.headers.authorization.replace('Bearer ', '');
aad.verify(jwtToken, null, function (err, result) {
if (result) {
const scopes = result.scp.split(',');
if (!scopes.includes("Prep.API")) {
res.status(401).json({
message: "Auth failed"
});
} else {
next();
}
} else {
res.status(401).json({
message: "Auth failed"
});
}
});
};
当我有这样的 web.config 时:
<configuration>
<appSettings>
<add key="virtualDirPath" value="/myapp" />
</appSettings>
<system.web>
<customErrors mode="Off" />
</system.web>
<system.webServer>
<!--<httpErrors existingResponse="Passthrough" />-->
<iisnode
watchedFiles="web.config;*.js;api///*.js" />
<handlers>
<add name="iisnode" path="server.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="api">
<match url="/*" />
<action type="Rewrite" url="server.js" />
</rule>
</rules>
</rewrite>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
回应是:
当我取消注释 httpErrors 行时,web.config 如下所示:
<configuration>
<appSettings>
<add key="virtualDirPath" value="/myapp" />
</appSettings>
<system.web>
<customErrors mode="Off" />
</system.web>
<system.webServer>
<httpErrors existingResponse="Passthrough" />
<iisnode
watchedFiles="web.config;*.js;api///*.js" />
<handlers>
<add name="iisnode" path="server.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="api">
<match url="/*" />
<action type="Rewrite" url="server.js" />
</rule>
</rules>
</rewrite>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
回应是:
那么我做错了什么或者我还能做些什么才能获得正确的状态代码以及 JSON 响应?如果没有别的,我怎样才能让 IIS 报告错误,以便我可以在事件查看器中看到异常或其他内容?
解决方案
只需确保使用 Pascal 大小写编写 PassThrough,通过的 T 字母应大写。
以下行对我来说工作正常。
<httpErrors existingResponse="PassThrough" />
推荐阅读
- python - 在 Sympy 中,如何定义像 f(x) 这样的通用函数,以便 sympy.diff(f(x), x) 返回 f' 而不是 0。
- php - 如何使用 Doctrine2 ORM 更新表并使其自动转换数据类型?
- c# - 添加 svg 作为形状节点而不是图像
- regex - Powershell捕获多个值?
- c# - 如何反序列化具有不同类型和不同元素数量的元素的 JSON 数组?
- visual-studio-code - 当“磁盘上的内容较新。请比较...”时取消本地更改
- java - AlertDialog.Builder.setView 导致 StackOverflowError
- c# - EF Core 2.1 group by 跳过和采取
- android - TextView 宽度约束不能动态工作
- c# - DataTable.PrimaryKey 填充了唯一的聚集索引,而不是主键