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

我正在使用Visual Studio 2013创build一个全新的工程,我selectAsp.Net MVC和框架4.5.1项目已经创build,那么除了F5,我什么也不做,只能启动默认的网页。 不幸的是,它产生了一个redirect到login页面,该页面也被redirect到login页面。 这是我在浏览器中的一个简短版本的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 – 未find请求筛选模块被configuration为拒绝查询string太长的请求。

该网站在IIS Express中以默认设置运行。 我该如何解决这个问题? 我猜测我的Visual Studio 2013有什么不对吗?

编辑

它可以工作,如果我创build一个全新的网站,我把它托pipe在IIS中。 但是,如果我创build一个新的网站(不需要修改任何东西),只需点击播放(默认启动IIS Express),它不会。

编辑2

我已经删除了Documents \ IISExpress \ config \ applicationhost.config中的每个网站 。 我已经重新编译了一切,并创build了这个条目:

  <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。

在Visual Studio中突出显示该项目

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

将“Windows身份validation”设置为“禁用”

将“匿名身份validation”设置为“已启用”

您在login操作时缺less[AllowAnonymous]属性。

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

第二种可能性 ,仅针对IIS Express:如果您多次创build相同的默认WebApplication1项目,使用不同的身份validation设置,IIS Express会在其configuration文件中存储额外的身份validation设置。 就像是:

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

configuration位于用户的文档文件夹Documents\IISExpress\config\ ,您应该查找:

 applicationhost.config 

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


更新VS 2015+

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

每个解决scheme都有自己的configuration文件。

这个问题是因为MVC 5 Templateselect了默认的authentication模式,MVC 5 Template触发了redirect的ReturnUrl风格,如果configuration不正确,可能会导致无限循环。

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

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

我不得不删除( 来源链接 ):

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

在IIS中,select您的网站并检查身份validation,如果您使用表单身份validation,则 –

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

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

例如,我有我的布局(其中login页面也使用),调用面包屑和侧边栏的2个子操作,他们没有AllowAnonymous属性(控制器有Authorize属性)。

希望这个帮助。

我遇到了同样的问题,因为我的MVC项目是为.NET 4.5configuration的,但是我在.NET中使用.Net 4.0作为我的应用程序池。 切换到.Net 4.5应用程序池,问题得到解决。 我希望这可以帮助别人!

TL:DR? 不要从授权页面调用受保护的Web API(任何需要授权的Web API),如〜/ Account / Login(本身不这样做)。 如果你这样做,你将在服务器端进入一个无限的redirect循环。

原因

我发现罪魁祸首是间接的, AccountController::AuthorizeAccountController[Authorize]装饰的事实。

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

确认

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

  1. [AllowAnonymous]装饰AccountController::Authorize
  2. 在视图模型构build过程中,注释Sammy()调用。

解决scheme是只发射应用程序包(又名“〜/束/应用程序”)已经需要授权的意见。 据我所知,Account / views是基于MVC的经典视图,并不是应用程序datamodel / viewmodel的一部分,但是我错误地将Scripts.Render(@"~/bundles/app")调到了_Layout.cshtml (导致对所有MVC视图进行受保护的Web API调用,包括/ Account /)。

ASP.Net MVC 5模板将Microsoft.Owin和相关库添加到项目中。 由于Owin基础设施不需要表单身份validation,该模板还在web.config中引入以下密钥。

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

这个键的存在可能是不希望的回到login页面的原因。 评论这可能有助于解决一些人的问题。

我刚刚处理了这个问题几个小时。

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

这段代码在注释掉时停止了redirect循环。

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

请注意,这可能是有害的build议,直接修改applicationhostconfiguration文件通常不是一个好主意,通常有一些工具可以安全地(例如在Visual Studio中)为您执行此操作。在继续之前,请确保在您的IIS Express被丢弃的情况下创build此文件的备份副本。

为了解决这个问题,我使用了位于这里的默认IISconfiguration文件:

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

给我的文件

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

它的工作。

这是因为我有一些Windows身份validation集,而不是匿名帐户。

确保你没有pipe道中有授权属性的动作。 在我的情况下,我的布局有导航菜单控制器,缺lessallowAnonymous属性。

当我在本地回电时,我遇到了类似的问题。 事实certificate,当在本地debugging它redirect的端口。 我在项目属性屏幕中更新了端口号,但在云项目中Azure定义保持不变,一切开始按预期工作。

我与我的Asp.Net MVC 4项目有同样的问题。 我解决了它的Startup.cs和注释掉ConfigureAuth(应用程序)

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

我也确保我在IIS中为我的项目启用了Windows身份validation,并禁用了所有其他身份validation选项。

我解决了同样的问题感谢这个接受的答案: ASP.NETloginredirect当用户不在angular色中的循环 。

包含login操作的控制器可能使用AuthorizeAttribute (甚至是自定义的)来装饰,而login操作没有使用AllowAnonymous属性进行修饰。 从控制器中删除AuthorizeAttribute并添加AllowAnonymous来login操作可能是一个可能的解决scheme。

对我来说,这原来是由我的LoginViewModel包含对翻译资源文件的引用引起的,显然受到了身份validation的保护。 我删除了这些引用,问题就解决了。

在我的情况:在我的_layout.cshtml,我使用Html.Action来调用授权控制器的行动:例如:Html.Action(“计数”,“产品”) – >循环错误

修复:在该Action中通过[AllowAnonymous]属性装饰(或从_layout中移除这些Html助手)

这些答案或多或less是同一个谜题的一部分; 我会尽量把所有东西放在一个地方。 在我实现OWINpipe道和AspNET标识的那一刻,所描述的OP就碰到了我的应用程序。

所以让我们看看如何解决它…

  1. OWIN启动

我想你需要它,因为如果你不需要,那么你不需要authentication,我想你会这样做。 除了你使用的是一些老式的身份validation,我想你不会。 所以,不要删除OWIN启动属性…

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

…或configuration线…

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

现在我们清除了这个,你需要authentication。 这意味着你的每一个控制器都需要[Authorize]属性,或者你也可以通过在全局注册这个东西来在同一个地方对所有的控制器做同样的事情(例如在RegisterGlobalFilters()中添加行filter.Add(new AuthorizeAttribute()) ) 。 在前一种情况下(分开安装每个控制器时)跳过这一部分,只要转到下一个。 在后一种情况下,您的所有控制器都将被保护以防未经授权的访问,因此您需要该授权的入口点 – 未受保护的Login()操作。 只要添加…

 [AllowAnonymous] 

…你应该很好。

  1. OWIN cookieconfiguration

当用户login时,他的浏览器会存储encryption(希望!)cookie以便简化系统。 所以,你需要cookie – 不要删除UseCookieAuthentication这一行。

  1. 您真正必须做的是closures您的Web应用程序的IIS集成身份validation机制。 这意味着通过设置Anonymous Authentication (启用),closuresWindows Authentication (禁用),并启用至less与IIS Express一样长的任何用户。

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

 <windowsAuthentication enabled="false" /> <anonymousAuthentication enabled="true" /> 
  1. 你可能有你的web.config中的授权configuration,说deny users="?" 。 这意味着授权子系统被指示防止匿名用户进入。 与OWIN,这仍然按照devise工作。 你要么删除这个,或者让你的匿名用户能够通过使用类似的东西访问login页面…

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

HTH

对我来说, 删除下面的块修复它:

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

承担

 <authentication mode="None" /> 

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

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