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 Service
、Local System
或Managed 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、Firefox 和 SQL Server 集成的 Windows 身份验证
ASP MVC Preview 5 和 IIS 6 Windows 身份验证