IIS 节点和 Windows 身份验证:IIS 网站不断提示输入凭据

Posted

技术标签:

【中文标题】IIS 节点和 Windows 身份验证:IIS 网站不断提示输入凭据【英文标题】:IIS Node and Windows Authentication: IIS-Website Keeps prompting for Credentials 【发布时间】:2021-04-30 05:45:27 【问题描述】:

我有一个使用 NodeJS、Express、passport 和 passport-windowsauth 在 localhost:3000 上运行的 IIS 网站。

当我尝试访问 URL 时,它会不断提示输入用户凭据 - 即使我输入了正确的凭据。它只是再次弹出。如果我选择“取消”,我显然会得到“未经授权”。整整 3 天以来一直在与此错误作斗争,并考虑放弃。我尝试了几乎所有我能找到的可能的解决方案,但没有成功。

奇怪的是:这个错误只发生在 Windows-VM (Virtualbox) 上。在普通的 Windows 操作系统上,它就像一个魅力,具有完全相同的代码和相同的 IIS 设置。这让我发疯了。

我尝试了什么:

为 IUSR / IUSRS 组授予完全访问权限,将 NTLM 放在首位,启用内核模式身份验证并将扩展保护设置为“接受”(建议 here) 将应用程序池标识更改为Local ServiceLocal SystemManaged System 按照here 的建议将localhost 添加到Internet 选项中的“受信任的站点”(尽管这感觉很奇怪) 尝试使用 IUSR 启用匿名身份验证 进行了安全环回检查(建议here 和here) 每次执行操作后都重新启动 在我做的每一个动作之后都做了iisreset 在处理程序映射中检查 IIS 节点 手动添加本地主机到“主机”文件 overrideModeDefault = Allow 用于applicationHost.config 中的 Windows 身份验证(以及匿名身份验证)

另外,我没有可能与问题相关的自定义错误页面。

server.js:

const express = require('express');
const server = express();
const passport = require('passport');
const WindowsStrategy = require('passport-windowsauth');
server.use(passport.initialize());
// https://***.com/questions/55296233/nodejs-express-passport-iis
passport.use('MyAuthStrategy', new WindowsStrategy(
    integrated: true
  ,
  function(profile, done) 
    if (profile) 
user = profile;
return done(null, user);

else 
return done(null, false);

  
));
//https://***.com/questions/19948816/passport-js-error-failed-to-serialize-user-into-session
passport.serializeUser(function(user, done) 
  done(null, user);
);
passport.deserializeUser(function(user, done) 
  done(null, user);
);
const port = process.env.PORT || 3000;
// use windows-authentication
server.get('/',
passport.authenticate('MyAuthStrategy'),
function (req, res) 
    res.json(req.user);
);
server.listen(port, () => 
    console.log(`Listening on $port`);
);

还有web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings>
        <!--
            All appSettings are made available to your Node.js app via environment variables
            You can access them in your app through the process.env object.
            
            process.env.<key>
        -->
        
       <!-- Unconmment the below appSetting if you'd like to use a Virtual Directory -->
       <!-- <add key="virtualDirPath" value="" /> -->
    </appSettings>
    <system.webServer>
        <!-- Remove the modules element if running on IIS 8.5-->
        <modules runAllManagedModulesForAllRequests="false" />
        <httpErrors existingResponse="PassThrough"></httpErrors>
        
        <iisnode node_env="%node_env%" nodeProcessCountPerApplication="1" maxConcurrentRequestsPerProcess="1024" maxNamedPipeConnectionRetry="100" namedPipeConnectionRetryDelay="250" maxNamedPipeConnectionPoolSize="512" maxNamedPipePooledConnectionAge="30000" asyncCompletionThreadCount="0" initialRequestBufferSize="4096" maxRequestBufferSize="65536" uncFileChangesPollingInterval="5000" gracefulShutdownTimeout="60000" loggingEnabled="true" logDirectory="iisnode" debuggingEnabled="true" debugHeaderEnabled="false" debuggerPortRange="5058-6058" debuggerPathSegment="debug" maxLogFileSizeInKB="128" maxTotalLogFileSizeInKB="1024" maxLogFiles="20" devErrorsEnabled="true" flushResponse="false" enableXFF="false" configOverrides="iisnode.yml" watchedFiles="web.config;*.js" nodeProcessCommandLine="C:\Program Files\nodejs\node.exe" />
                 
        <!-- 
            Before the handlers element can work on IIS 8.5
            follow steps listed here https://github.com/tjanczuk/iisnode/issues/52 
        -->                 
        <handlers>
      <add name="iisnode" path="server.js" verb="*" modules="iisnode" />
    </handlers>
        <rewrite>
            <rules>
                <!-- Don't interfere with requests for node-inspector debugging -->
                <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
                    <match url="^server.js\/debug[\/]?" />
                </rule>
                <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
                <rule name="StaticContent" patternSyntax="Wildcard">
                    <action type="Rewrite" url="public/R:0" logRewrittenUrl="true" />
                    <conditions>
                        <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
                    </conditions>
                    <match url="*.*" />
                </rule>
                <!-- All other URLs are mapped to the Node.js application entry point -->
                <rule name="DynamicContent">
                    <conditions>
                        <add input="REQUEST_FILENAME" matchType="IsFile" negate="True" />
                    </conditions>
                    <action type="Rewrite" url="server.js" />
                </rule>
                <rule name="SocketIO" patternSyntax="ECMAScript">
                    <match url="socket.io.+" />
                    <action type="Rewrite" url="server.js" />
                </rule>
            </rules>
        </rewrite>
        <directoryBrowse enabled="true" />
        <security>
            <authentication>
                <anonymousAuthentication enabled="false" userName="IUSR" />
                <windowsAuthentication enabled="true" useKernelMode="true">
                    <extendedProtection tokenChecking="Allow" />
                    <providers>
                        <clear />
                        <add value="NTLM" />
                        <add value="Negotiate" />
                    </providers>
                </windowsAuthentication>
            </authentication>
        </security>
    </system.webServer>
    <system.web>
    <authentication mode="Windows" />
    <authorization>
        <allow users="*" />
    </authorization>
    <identity impersonate="false" />
</system.web>
</configuration>

这里安装的功能:

任何建议将不胜感激。我真的不知道该怎么办。

【问题讨论】:

【参考方案1】:

IIS 网站不断提示输入凭据

经过测试,我发现只有输入错误的凭据才会出现这种情况。 因此您必须确保输入正确的 Windows 凭据。

如果您使用的是域帐户,则在提供凭据时还必须提供域帐户所在的域:

【讨论】:

丁笔您好,非常感谢您的回答。尝试了您的方法,但不幸的是,它不起作用。它仍然一次又一次地提示输入凭据:( 您可以启用 FRT 以查看 IIS 内部的问题。我认为windows凭据应该有问题:docs.microsoft.com/en-us/iis/troubleshoot/… 是否可以在 iisnode 中使用模拟?

以上是关于IIS 节点和 Windows 身份验证:IIS 网站不断提示输入凭据的主要内容,如果未能解决你的问题,请参考以下文章

IIS 混合匿名和 Windows 身份验证

匿名之前的 IIS Windows 身份验证

与 IIS、Firefox 和 SQL Server 集成的 Windows 身份验证

ASP MVC Preview 5 和 IIS 6 Windows 身份验证

Silverlight 4中的IIS Windows身份验证问题

使用 Windows 身份验证的 IIS 托管 WCF 服务和 SQL 查询