78

我正在使用 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。

4

21 回答 21

67

在 Visual Studio 中突出显示项目

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

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

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

于 2013-12-08T14:03:52.087 回答
39

您缺少[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节点<location path="WebApplication1">


VS 2015+ 的更新

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

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

于 2013-10-26T01:08:45.093 回答
36

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

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

<add key="owin:AutomaticAppStartup" value="false"/>
于 2015-04-14T11:31:33.280 回答
7

我不得不删除(Source Link):

<authorization>
  <deny users="?" />
</authorization>
于 2014-03-24T12:53:03.300 回答
7

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

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

希望这有帮助。

于 2015-10-07T21:41:17.597 回答
6

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

  1. 将“Windows 身份验证”设置为“禁用”,
  2. 将“匿名身份验证”设置为“启用”
  3. 将“表单身份验证”设置为“启用”
于 2015-08-07T19:23:55.387 回答
3

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

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

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

于 2015-09-15T15:47:41.730 回答
2

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

于 2013-12-06T08:52:40.840 回答
2

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

原因

我发现罪魁祸首是,间接地AccountController::AuthorizeAccountController[Authorize].

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

确认

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

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

解决方案

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

于 2014-09-09T08:15:33.663 回答
2

就我而言:在我的 _layout.cshtml 中,我使用 Html.Action 从授权控制器调用 Action:例如:Html.Action("Count", "Product") -> 循环错误

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

于 2016-04-01T13:28:26.893 回答
2

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

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

此代码在被注释掉时会停止重定向循环。

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
于 2016-05-11T19:05:46.597 回答
1

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

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

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

到我的文件

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

它奏效了。

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

于 2013-10-29T01:36:21.073 回答
1

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

于 2015-11-11T17:19:00.000 回答
1

由于这个公认的答案,我解决了同样的问题:ASP.NET Login Redirect Loop when user not in role

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

于 2015-12-15T10:08:49.003 回答
1

这些答案或多或少是同一个难题的一部分。我会尽量把所有东西都放在一个地方。OP 描述的问题在我实现 OWIN 管道和 AspNET Identity 的那一刻打击了我的应用程序。

那么让我们看看如何修复它......

  1. 欧文启动

我猜你需要它,因为如果你不需要,那么你就不需要身份验证,我猜你需要。除了你正在使用一些老式的身份验证,我猜你没有。所以,不要删除任何一个 OWIN 启动属性......

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

...或配置行...

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

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

[AllowAnonymous]

......你应该很好。

  1. OWIN cookie 配置

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

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

当您启动您的网站时,这会将这些设置复制到 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>

高温高压

于 2016-10-25T08:55:08.940 回答
0

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

于 2015-02-09T19:18:53.803 回答
0

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

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

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

于 2015-07-14T18:09:43.550 回答
0

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

于 2016-02-05T15:19:08.177 回答
0

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

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

认为

<authentication mode="None" />
于 2017-06-15T06:54:50.467 回答
0

就我而言,这是一个非常有线的问题,我用不存在的角色装饰了家庭控制器。所以它会导致重定向循环。

于 2019-06-08T12:08:58.117 回答
-1

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

<authentication>

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

        </authentication>
于 2014-07-03T15:33:25.927 回答