首页 > 解决方案 > 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 报告错误,以便我可以在事件查看器中看到异常或其他内容?

标签: node.jsiisiis-7.5iis-6iisnode

解决方案


只需确保使用 Pascal 大小写编写 PassThrough,通过的 T 字母应大写。

以下行对我来说工作正常。

<httpErrors existingResponse="PassThrough" />

推荐阅读