表单身份验证重定向 css/脚本包含到带有 HTTP 302 的登录页面

Posted

技术标签:

【中文标题】表单身份验证重定向 css/脚本包含到带有 HTTP 302 的登录页面【英文标题】:Forms auth redirecting css/script includes to the login page with HTTP 302 【发布时间】:2011-09-12 08:53:18 【问题描述】:

我在登录页面、css 文件和 js 文件中有一些包含。

<link rel="stylesheet" type="text/css" href="../../ext/resources/css/ext-all.css" />
<script type="text/javascript" src="../../ext/bootstrap.js"></script>

不幸的是,浏览器发出的请求会得到 302 响应。 Forms Auth 将请求视为未经授权,并将其重定向到登录页面。它没有意识到请求首先来自登录页面。

GET http://localhost:50880/ext/resources/css/ext-all.css HTTP/1.1

HTTP/1.1 302 Found
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/Account/LogOn?ReturnUrl=%2fext%2fresources%2fcss%2fext-all.css">here</a>.</h2>
</body></html>

我想也许为每个人设置包含文件夹(ext)的权限可能会有所帮助。

我在其他项目中没有遇到过这个问题。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。这是我解决它的方法。

在 IIS7 中,单击您的网站,然后双击“身份验证”按钮。 单击匿名身份验证,然后单击右侧的编辑...链接。 确保选中“应用程序池标识”复选框。

我的应用程序池在“网络服务”用户(不是“ApplicationPoolIdentity”)下运行。您可以在 IIS 应用程序池的高级设置中选择标识。此用户已获得网站文件系统的完全访问权限。

【讨论】:

这个答案需要更多地在互联网上提供 - 挖掘如此之多,修复如此之快。 让我免于沮丧。谢谢。 天啊,为什么不默认设置? 是的,这是我的问题,它被设置为特定用户 IUSR 或任何该帐户名称。将其切换为应用程序池 ID,然后 BOOM 就可以了。 就在我准备把电脑扔出窗外的时候,这个人用他的智慧之言救了我。【参考方案2】:

您需要在配置文件中排除 css 文件和图像进行身份验证,如下所示。使用位置标签可以排除单个文件或目录。

<location path="<RELATIVE_PATH_OF_YOUR_RESOURCE_FILES>">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

【讨论】:

谢谢,这个我不知道。话虽如此,如果我创建一个新的 ASP 或 MVC 项目,登录页面会正确获取 CSS,而 web.config 中没有类似的内容。有什么想法吗? 你需要在配置文件中提到登录页面,这样如果用户没有通过身份验证,他会被重定向到哪里?我不确定我们是否在这种情况下指定登录页面,是否需要排除 css 和图像文件,我需要检查 我误会了,默认情况下,mvc 应用程序会拒绝所有匿名用户。事实上,如果我将它添加到 web.config 那么它确实会阻止登录页面上的默认 css。我正在一个私人网站上工作,因此阻止所有并强制登录方法效果更好。在这种情况下,我使用您的解决方案来打开应用程序的某些部分,例如脚本和内容。谢谢! 我想通了。这是我在设置新的 IIS 应用程序时从清单中遗漏的内容:选择应用程序,双击“身份验证”,选择“匿名身份验证”,然后编辑,然后将其更改为使用应用程序池标识。确保用户对包含该站点的文件夹具有权限。 这也没有为我解决问题,但我发现了我的问题——CSS/JS 文件已加密(通过 NTFS),我刚刚将它们拖到项目中,因此它们保持加密状态。取消选中文件属性下的“加密”复选框解决了这个问题。【参考方案3】:

所以,这就是我所做的,完全解决了这个问题。

首先,我像其他人所说的那样对 web.config 进行了更改。

我在 IIS 中使用匿名身份验证,如本期所述,我进入 IIS > 应用程序池 > 右键单击​​我的应用程序池 > 编辑 > 更改应用程序池以使用应用程序池标识。

然后 - 我转到包含我的站点的父文件夹,进入该文件夹的权限,并添加服务器的 NETWORK SERVICE 帐户以访问该文件夹。那是为我做的。这是因为 Application Pool 是在 ApplicationPoolIdentity 下运行的,也就是本地机器上的 NETWORK SERVICE 帐户。

希望这对某人有所帮助!

【讨论】:

【参考方案4】:

我遇到的问题是我从互联网上下载了一个 jquery 插件并将其复制到我在网络服务器上的内容目录中,Windows 将其下的所有文件都阻止了,因此它们无法被正确访问网络服务器。在 Windows 中解锁文件解决了这个问题。

【讨论】:

+1 在这里,对于执行了上述所有操作但仍然遇到此问题的任何人,请检查 Windows 是否阻止了该文件。这在我之前从未发生过,甚至不知道 Windows 做到了【参考方案5】:

这里的答案较晚,但我想帮助阐明这个 IISsue。 (看看我做了什么?)

首先,我想说的是,David Conlisk 的答案是“万无一失”的答案。但是,如果您像我一样部署了许多使用 Forms 和 Anonymous auth 的应用程序,其中 Anonymous Auth Identity 设置为 IUSR,而我现在突然发现这个问题,那么请听听如何我重现了这个问题,希望能够避免同样的困境。


我的标准做法是让我的 Web 应用程序的 AppPoolIdentity 作为网络服务运行。然后我只需转到虚拟目录指向的磁盘上的实际目录 -> 右键单击 -> 属性 -> 安全选项卡 -> 编辑 -> 添加网络服务用户 -> 授予读/写权限。

然后我在我需要的目录(js、css等)上启用匿名身份验证。应用程序池标识默认为IUSR。

好的。现在突然在我的开发环境中,我开始在我的所有 css 和 js 上获得 302 个表单身份验证重定向!发生了什么? 我将我的 Web 应用程序上的 SVN 切换到源代码控制中的不同分支。啊。它完全提升了我对每个文件的所有磁盘权限。我曾经能够修复它的唯一方法是删除整个网络应用程序,并重新结帐并重新应用网络服务读取权限(或对每个文件应用权限......是的,我已经尝试过删除并重新添加父级文件夹的权限)。

所以这一次,我决定“见鬼去吧。我将我的网络应用程序作为 本地系统 运行。这将显示谁的老板的磁盘权限。这有时对我有用作为短期解决方法。”但很可惜,不是今天。我向你发誓,在我眼前,我正在查看具有完全相同配置的表单身份验证 Web 应用程序的两个部署,并且 302 问题仅在我的开发机器上重现。唯一的区别是我机器上最近的 SVN 开关。

只要我登录并获得 Forms Auth Cookie,js 和 css 下载就好了。


请耐心等待,我刚刚有了一个令人震惊的发现。我部署的所有服务器都具有授予 MACHINE_NAME\Users 的读取权限。而我的开发机器没有。将其添加到我的开发机器后,我就可以下载我的 css。


TLDR;

故事的寓意是您可以将匿名身份验证身份保留为 IUSR,但是您必须授予所有用户对磁盘上 Web 应用程序的读取权限。

由于这是一个坏主意(出于安全原因),我将采用 David C 的答案并将匿名身份验证身份作为应用程序池身份运行作为我的新做法。

【讨论】:

虽然是很久以前的事了,而且由于您使用 bold 脸型来强调某些部分,因此最好指出 Local 的使用系统 = 安全问题 ;-) 哈哈,所以我说“见鬼去吧!”不过很好 - 我不应该想当然地认为人们知道将网络应用程序作为本地系统运行是一个坏主意:)

以上是关于表单身份验证重定向 css/脚本包含到带有 HTTP 302 的登录页面的主要内容,如果未能解决你的问题,请参考以下文章

无需重定向到 Keycloak 的客户端身份验证

登录后 Laravel 基本身份验证重定向到 HTTPS 路由

Laravel - 身份验证重定向到带有 302 找到代码的页面

Spring Cloud OAuth2:身份验证后再次重定向到登录页面,就像使用表单登录时未经身份验证一样

带有访客和身份验证中间件的 Nuxt 身份验证将经过身份验证的用户在刷新时重定向到错误的页面

带有 spotify 身份验证回调 url 的 Aspnet Core MVC 应用程序重定向到 127.0.0.1