繁体   English   中英

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

[英]New Asp.Net MVC5 project produces an infinite loop to login page

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

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。

在Visual Studio中突出显示该项目

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

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

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

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

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

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

您在登录操作中缺少[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

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


VS 2015+更新

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

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

我不得不删除( Source Link ):

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

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

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

希望这有帮助。

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

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

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

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

原因

我发现罪魁祸首是间接地, AccountController::Authorize以及AccountController[Authorize]修饰的事实。

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

确认

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

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

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

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

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

此密钥的存在可能是不合需要的循环返回登录页面的原因。 评论它可能有助于解决某些人的问题。

在我的情况下:在我的_layout.cshtml中,我使用Html.Action从Authorize Controller调用Action:ex:Html.Action(“Count”,“Product”) - >循环错误

修复:通过该Action中的[AllowAnonymous]属性进行装饰(或从_layout中删除这些Html帮助程序)

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

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

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

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

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

要解决此问题,我使用了位于此处的默认IIS配置文件:

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

到我的文件

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

它奏效了。

这是因为我有一些Windows Authentification设置而不是匿名帐户。

确保您在管道中没有具有授权属性的操作。 在我的情况下,我的布局有导航菜单控制器,它缺少allowAnonymous属性。

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

包含Login操作的控制器可能使用AuthorizeAttribute (甚至是自定义属性)进行修饰,而登录操作未使用AllowAnonymous属性进行修饰。 从控制器中删除AuthorizeAttribute并将AllowAnonymous添加到登录操作可能是一种可能的解决方案。

这些答案或多或少是同一个难题的一部分; 我会尽力把所有东西放在一个地方。 在我实现OWIN管道和AspNET标识的那一刻,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()中添加行filter.Add(new AuthorizeAttribute()) ) 。 在前一种情况下(单独保护每个控制器时)跳过此部分,只需转到下一个。 在后一种情况下,所有控制器都将受到保护,以防止未经授权的访问,因此您需要该授权的入口点 - 不受保护的Login()操作。 只需添加......

[AllowAnonymous]

......你应该好。

  1. OWIN cookie配置

当您的用户登录时,他的浏览器会存储加密的(希望!)cookie,以简化系统的操作。 所以,你需要cookie - 不要删除说UseCookieAuthentication的行。

  1. 您真正需要做的是关闭Web应用程序的IIS集成身份验证机制。 这意味着通过设置Anonymous Authentication (已启用),关闭Windows 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>

HTH

当我在本地回调网站时,我遇到类似的问题。 事实证明,在本地调试时,它正在重定向端口。 我在项目属性屏幕中更新了端口号,但在云项目中将Azure定义保持不变,一切都按预期开始工作。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM