新的Asp.Net MVC5项目产生一个无限循环来登录页面


76

我正在用Visual Studio 2013创建一个全新的项目,我选择Asp.Net MVC和框架4.5.1创建了项目,然后,除了F5以外,我什么也不做来启动默认网页。不幸的是,它会产生一个到登录页面的重定向,该页面也正在重定向到登录页面。这是我在浏览器中拥有的url的简短版本:

http://localhost:5285/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl%253D%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FAccount%2525252525252FLogin%2525252525253FReturnUrl%2525252525253D%252525252525

我在事件查看器中没有任何错误。但是在屏幕上我看到了:

“ HTTP错误404.15-找不到请求过滤模块被配置为在查询字符串太长的情况下拒绝请求。”

该网站使用IIS Express中的默认设置运行。我该如何解决这个问题?我猜我的Visual Studio 2013有问题吗?

编辑

如果我创建了一个全新的网站并将其托管在IIS中,那么它将起作用。但是,如果我创建了一个新网站(不进行任何修改)并且只是点击播放(默认情况下将启动IIS Express),则不会。

编辑2

我已经删除了Documents \ IISExpress \ config \ applicationhost.config中的每个网站。我重新编译了所有内容,并创建了以下条目:

    <siteDefaults>
        <logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
        <traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
    </siteDefaults>
    <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

IIS Express仍然出现错误,而不是IIS。

Answers:


66

在Visual Studio中突出显示项目

打开右侧的“属性”面板(或按F4键)

将“ Windows身份验证”设置为“禁用”

将“匿名身份验证”设置为“启用”


4
密钥是将“匿名身份验证”设置为“启用”
坦率地说,

16
但是,如果我真的想要启用Windows身份验证和禁用匿名身份验证,该怎么办?这是因为我要获取Intranet应用程序的用户的Windows登录信息。
大卫

嗨,罗布,这些不是Visual Studio项目的属性。它们是IIS管理器中的设置。设置它们为我解决了问题。
乔恩·埃德里奇

解决了我的问题!谢谢!!
wadefanyaoxia

37

您缺少[AllowAnonymous]登录操作的属性。

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    // code....
}

第二种可能性,仅特定于IIS Express:如果WebApplication1多次创建相同的默认项目,并且使用不同的身份验证设置,则IIS Express会在其配置文件中存储其他身份验证设置。就像是:

    <location path="WebApplication1">
        <system.webServer>
            <security>
                <authentication>
                    <windowsAuthentication enabled="true" />
                    <anonymousAuthentication enabled="false" />
                </authentication>
            </security>
        </system.webServer>
    </location>
</configuration>

配置位于用户的Documents文件夹中Documents\IISExpress\config\,您应该查找:

applicationhost.config

然后只需删除<location path="WebApplication1">上面提到的xml节点即​​可。


VS 2015+更新

如果您使用的是Visual Studio 2015或更高版本,请检查此路径以获取配置文件: $(solutionDir)\.vs\config\applicationhost.config

每个解决方案都有自己的配置文件。


不。默认情况下它在那里,我什么都没改变。
Patrick Desjardins,2013年

让我尝试一下
帕特里克·德斯贾丁斯

我已经更新了问题。删除xml节点不能解决问题。
Patrick Desjardins,2013年

1
不是site部分,而是location文件底部的单独部分。并搜索您的应用名称。
内纳德(Nenad),2013年

1
@Nenad我花了几个小时来解决这个问题。我很想知道您的答案是我的解决方案,但是该applicationhost.config文件Documents夹中的文件没有引用我的项目,因此我放弃了这种方法-事实证明,这是不成熟的决定。确实,您的回答是正确的,但是,文件位置在新版本的Visual Studio(2015+)中已更改。该文件现在位于解决方案的根目录中。我已经更新了您的答案以包含此新信息。谢谢。
凌晨

36

此问题是由于MVC 5模板(默认情况下)选择了身份验证模式所致,该模式触发了ReturnUrl重定向样式,如果配置不正确,可能会导致无限循环。

要禁用OWIN启动发现,请将此密钥添加到您的webconfig文件中。

<add key="owin:AutomaticAppStartup" value="false"/>

6
哇,这为我解决了这个问题。究竟该如何在地球上找到这个人?谢谢阿米哥。
15:04启用

这也解决了我的问题!怎么可能...?有人在乎分享它是什么吗?编辑:好吧,它不再重定向到登录页面,而是显示401错误?
2015年

1
如果我需要owin启动怎么办?(实际上我已经建立了startup.cs)
Jogi,2016年

1
现在我可以登录了,但是注销时导致了我的问题。这对我来说不是最佳答案。不管怎么说,还是要谢谢你。
MAF博士

1
这是在appsettings中吗?
Rez.Net

7

我不得不删除(Source Link):

<authorization>
  <deny users="?" />
</authorization>

使用nuget update-package命令升级后,这是我的问题...奇怪的是,更新将这些行添加到了web.config
Dragouf 2014年

这很有趣,因为对我而言是另一回事。我必须添加它才能使其正常工作!
Exel Gamboa

7

我知道我可能会迟到,这不是直接针对OP的问题。但是,如果将来有人来这里,还有一项检查AllowAnonymousAuthorize属性是,您也必须检查所有子操作

例如,我的布局(“登录”页面也使用了该布局)调用了面包屑和侧边栏的2个子操作,而它们没有AllowAnonymous属性(Controller具有Authorize属性)。

希望对您有所帮助。


我花了两个小时才能找到您的答案,然后花了2分钟才能找到隐藏在我们布局中的子动作,该子动作缺少AllowAnonymous属性。
nemesv

@nemesv很高兴我可以帮助您:)感谢您的悬赏!
路加福音

我需要为导航布局添加ViewModel和Controller。NavBarController Index()操作上没有[AllowAnonymous]导致Login()操作无限循环。
Smitty-Werben-Jager-Manjenson

5

在IIS中,选择您的网站并检查身份验证,如果您使用的是表单身份验证,则-

  1. 将“ Windows身份验证”设置为“已禁用”,
  2. 将“匿名身份验证”设置为“启用”
  3. 将“表单身份验证”设置为“启用”

在我们的团队对解决方案进行了一些更改之后,我收到了此错误。这个答案对我有很大帮助。谢谢。
MAF博士

3

ASP.Net MVC 5模板将Microsoft.Owin和相关库添加到项目中。由于Owin基础架构不需要表单身份验证,因此模板还在web.config中引入了以下密钥。

<system.webServer>
  <modules>
    <remove name="FormsAuthentication" />
  </modules>
</system.webServer>

此密钥的存在可能是导致循环回“登录”页面的原因。评论它可能有助于解决某些人的问题。


2

我遇到了同样的问题,因为我的MVC项目是为.Net 4.5配置的,但是我将.Net 4.0用作IIS中的应用程序池。将其切换到.Net 4.5应用程序池,此问题已解决。希望这对其他人有所帮助!


2

TL:DR? 请勿从授权页面(例如〜/ Account / Login(本身不会执行此操作))调用受保护的Web API(任何需要授权的Web API)。如果这样做,您将在服务器端进入无限重定向循环。

原因

我发现罪魁祸首是间接造成的,AccountController::Authorize而且事实真相AccountController[Authorize]

根本原因是从HomeViewModel()(home.viewmodel.js的第6行)调用了Sammy(),它正在访问“受保护的Web API”。这是针对/ Account / Login完成的,导致/ Account / Login重定向到其自身。

确认书

您可以通过几种方法确认这是导致问题的原因:

  1. 装饰AccountController::Authorize[AllowAnonymous]
  2. 注释掉在构造视图模型期间进行的Sammy()调用。

解决方案是仅针对已经需要授权的视图发出应用程序捆绑包(也称为“〜/ bundles / app”)。据我所知/ Account /视图是基于MVC的经典视图,并且不属于应用程序数据模型/ viewmodel的一部分,但是我错误地将bundleScripts.Render(@"~/bundles/app")调用移至_Layout.cshtml中(导致对所有MVC视图进行受保护的Web API调用,包括/ Account /。)


2

在我的情况下:在_layout.cshtml中,我使用Html.Action从授权控制器调用Action:例如:Html.Action(“ Count”,“ Product”)->循环错误

修复:通过该操作中的[AllowAnonymous]属性进行修饰(或从_layout中删除这些HTML帮助器)


2

我只是连续几个小时处理了这个问题。

对我来说,它在Startup.Auth.cs文件中。

注释掉后,此代码停止了重定向循环。

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });

就我而言,我只需要注释掉“ LoginPath = new PathString(“ / Account / Login”)“
Ryan Dunphy

2
您的建议是仅删除整个登录重定向功能。这对我来说似乎不是有效的解决方案。
停摆

1

请注意,这可能是有害的建议,直接修改applicationhost配置文件通常不是一个好主意,通常有一些工具可以安全地为您做到这一点(例如,在Visual Studio中)。在继续之前,请确保在您的IIS Express遭到破坏时创建此文件的备份副本。

为了解决此问题,我采用了位于以下位置的默认IIS配置文件:

C:\Windows\System32\inetsrv\config\applicationHost.config

到我的文件

%userprofile%\documents\iisexpress\config\applicationhost.config

而且有效。

这是因为我设置了一些Windows身份验证,而不是匿名帐户。


这对我不起作用,只会导致iisexpress在启动时崩溃
ozhug 2013年

1

确保管道中没有具有授权属性的操作。就我而言,我的布局具有导航菜单控制器,该控制器缺少allowAnonymous属性。


1

由于这个公认的答案,我解决了相同的问题:用户不在角色时的ASP.NET登录重定向循环

包含“登录”操作的控制器有可能被装饰AuthorizeAttribute(甚至是自定义的),而“登录”操作没有被AllowAnonymous属性装饰。AuthorizeAttribute从控制器中删除并添加AllowAnonymous到登录操作可能是一种解决方案。


它可能会扩大之前已确定的其他行动。
Mariusz

1

这些答案或多或少是同一个谜题的一部分。我将尝试将所有内容放在一起。当我实现OWIN管道和AspNET Identity时,OP描述的问题就击中了我的应用程序。

让我们来看看如何解决...

  1. OWIN启动

我猜您需要它,因为如果不需要,则不需要身份验证,而我想您需要。除此之外,您使用的是旧式身份验证,但我猜您没有。因此,请勿删除OWIN启动属性。

[assembly: OwinStartupAttribute(typeof(YourApp.Probably_App_Start.SomethingLikeAuthConfig))]

或配置行

<add key="owin:AppStartup" value="YourApp.Probably_App_Start.SomethingLikeAuthConfig" />
  1. 控制器的访问限制

现在我们清除了这一点,您需要身份验证。这意味着您的每个控制器都需要该[Authorize]属性,或者您可以通过全局注册该对象(例如,在RegisterGlobalFilters()add行中filter.Add(new AuthorizeAttribute()))对一个位置的所有控制器执行相同的操作。在前一种情况下(分别保护每个控制器时),请跳过此部分,仅转到下一部分。在后一种情况下,将保护所有控制器免受未经授权的访问,因此您需要该授权的入口点-未经保护的Login()操作。只需添加...

[AllowAnonymous]

...你应该很好。

  1. OWIN cookie配置

当您的用户登录时,其浏览器将存储加密的(希望!)cookie,以简化系统操作。因此,您需要Cookie-请勿删除显示的行UseCookieAuthentication

  1. 您真正要做的是为您的Web应用程序关闭IIS集成身份验证机制。这意味着要关闭Windows Authentication(禁用)并通过设置Anonymous Authentication(启用)启用至少允许IIS Express进入的任何用户。

当您启动网站时,这将依次将这些设置复制到IIS Express配置(applicationhost.config)中,在那里您应该看到以下两行:

<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="true" />
  1. 您的web.config中可能有授权配置,内容为deny users="?"。这意味着指示授权子系统阻止匿名用户进入。对于OWIN,这仍然按设计工作。您要么必须删除它,要么使您的匿名用户能够使用类似...的方式访问“登录”页面。

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

高温超导


0

在本地回拨网站时,我遇到了无限循环中的类似问题。事实证明,在本地调试时,它正在重定向端口。我在项目属性屏幕中更新了端口号,但在云项目中保留了Azure定义,并且一切开始按预期工作。


0

我的Asp.Net MVC 4项目也遇到了同样的问题。我通过转到Startup.cs并注释掉ConfigureAuth(app)这一行来解决了它

    public void Configuration(IAppBuilder app)
    {
        //ConfigureAuth(app);
    }

我还确保在项目中的IIS中启用了Windows身份验证,并且禁用了所有其他身份验证选项。


0

对我来说,这可能是由于我的LoginViewModel包含对翻译资源文件的引用,显然受到了身份验证的保护。我删除了这些参考,问题就解决了。


0

对我来说,删除以下代码块可以解决此问题:

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

承担

<authentication mode="None" />

0

就我而言,这是一个非常棘手的问题,我通过不存在的角色来装饰家庭控制器。因此会导致重定向循环。


-1

转到您的applicationhost.config文件,并设置anonymousauthentication =“ true”

<authentication>

            <anonymousAuthentication enabled="true" userName="" />
            <windowsAuthentication enabled="true">
                <providers>
                    <add value="Negotiate" />
                    <add value="NTLM" />
                </providers>
            </windowsAuthentication>

        </authentication>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.