web-dev-qa-db-ja.com

新しいAsp.Net MVC5プロジェクトは、ログインページへの無限ループを生成します

Visual Studio 2013でまったく新しいプロジェクトを作成しています。Asp.NetMVCとフレームワーク4.5.1を選択します。プロジェクトが作成されたら、F5以外はデフォルトのWebページを開始しません。残念ながら、ログインページへのリダイレクトも生成され、ログインページにもリダイレクトされます。ブラウザにある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-見つかりません要求フィルターモジュールは、クエリ文字列が長すぎる要求を拒否するように構成されています。」

WebサイトはIIS Expressのデフォルト設定で実行されています。この問題を解決するにはどうすればよいですか?Visual Studio 2013に何か問題があると思いますか?

編集

新しいWebサイトを作成し、IISでホストすると機能します。ただし、新しいWebサイトを(何も変更せずに)作成し、play(デフォルトでIIS Expressを開始)を押す)を押すと、それはできません。

編集2

Documents\IISExpress\config\applicationhost.configのすべてのwebsitesを削除しました。私はすべてを再コンパイルしました、そしてそれはこのエントリを作成しました:

    <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ではなくIIS Expressでエラーが発生します。

73

これは潜在的に有害なアドバイスであることに注意してください、applicationhost configファイルを直接変更することはめったに良い考えではありません、通常、あなたのために安全にこれを行うツールがあります(たとえば、内部からVisual Studio。)先に進む前に、IIS Expressがゴミ箱になった場合に備えて、このファイルのバックアップコピーを作成してください。

この問題を修正するために、デフォルトのIISここにある構成ファイルを使用しました:

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

私の文書へ

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

そしてそれは働いた。

これは、匿名アカウントではなく、Windows認証が設定されていたためです。

1

Visual Studioでプロジェクトを強調表示する

右側の[プロパティ]パネルを開きます(またはF4を押します)

「Windows認証」を「無効」に設定します

「匿名認証」を「有効」に設定します

65
RobA2345

この問題は、MVC 5テンプレートによって(デフォルトで)選択された認証モードが原因であり、正しく設定されていないと、ReturnUrlスタイルのリダイレクトが無限ループにつながる可能性があります。

OWINスタートアップ検出を無効にするには、このキーをwebconfigファイルに追加します。

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

ログインアクションに_[AllowAnonymous]_属性がありません。

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

2番目の可能性、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

各ソリューションには独自の設定ファイルがあります。

34
Nenad

削除する必要がありました( ソースリンク ):

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

私は遅れる可能性があることを知っていますが、これはOPの質問のためではありません。しかし、将来、誰かがここに来た場合、AllowAnonymousおよびAuthorize属性に関するもう1つのチェックは、すべての子アクションもチェックする必要があるということです。

たとえば、パンくずリストとサイドバーの2つの子アクションを呼び出すレイアウト(ログインページでも使用)があり、AllowAnonymous属性がありません(コントローラーにはAuthorize属性がありました)。

この助けを願っています。

6
Luke Vo

IISで、Webサイトを選択し、認証を確認します。フォーム認証を使用している場合-

  1. 「Windows認証」を「無効」に設定し、
  2. 「匿名認証」を「有効」に設定します
  3. 「フォーム認証」を「有効」に設定します
5
Sanjay Sharma

ASP.Net MVC 5テンプレートは、Microsoft.Owinおよび関連ライブラリをプロジェクトに追加します。 Owinインフラストラクチャはフォーム認証を必要としないため、テンプレートはweb.configに次のキーも導入します。

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

このキーの存在は、ログインページへの望ましくないループバックの原因になる可能性があります。コメントすることで、一部の人の問題を解決できる場合があります。

2
A is A

私のMVCプロジェクトは.Net 4.5用に構成されていたが、IISのアプリケーションプールとして.Net 4.0を使用していたため、同じ問題に直面しました。 .Net 4.5アプリケーションプールに切り替え、問題は修正されました。これが他の人の助けになることを願っています!

2
Kam

私はこの問題を何時間も続けました。

私にとっては、Startup.Auth.csファイルにありました。

このコードは、コメントアウトされると、リダイレクトループを停止しました。

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

TL:DR?〜/ Account/Loginなどの認証ページから保護されたWeb API(認証を必要とするWeb API)を呼び出さないそれ自体は、これを行いません。)。その場合、サーバー側で無限リダイレクトループに入ります。

原因

犯人は間接的に_AccountController::Authorize_であり、AccountControllerが_[Authorize]_で装飾されているという事実が見つかりました。

根本原因は、「保護されたWeb API」にアクセスしていたHomeViewModel()(home.viewmodel.jsの6行目)から呼び出されたSammy()でした。これは/ Account/Loginで行われていたため、/ Account/Loginがそれ自体にリダイレクトされていました。

確認

これが問題の原因であることをいくつかの方法で確認できます。

  1. _AccountController::Authorize_を_[AllowAnonymous]_で装飾する
  2. ビューモデルの構築中に行われたSammy()呼び出しをコメント化します。

解決

解決策は、承認が必要なビューに対してのみアプリバンドル(別名「〜/ bundles/app」)を発行することでした。私の知る限り、/ Account /ビューは古典的なMVCベースのビューであり、アプリのdatamodel/viewmodelの一部ではありませんが、誤ってバンドルScripts.Render(@"~/bundles/app")呼び出しを_Layout.cshtmlに移動していました(保護されたWeb API呼び出しを引き起こします)/Account /を含むすべてのMVCビューに対して作成されます。)

2
Shaun Wilson

私の場合:私の_layout.cshtmlで、Html.Actionを使用してAuthorize ControllerからActionを呼び出します:例:Html.Action( "Count"、 "Product")-> loop error

修正:そのアクションの[AllowAnonymous]属性で飾る(またはこれらのHTMLヘルパーを_layoutから削除する)

2
TienQuang

承認属性を持つアクションがパイプラインにないことを確認してください。私の場合、レイアウトには、allowAnonymous属性が欠落していたナビゲーションメニューコントローラーがありました。

1
Kalyan

これらの答えは、多かれ少なかれ同じパズルのかけらです。すべてを1か所にまとめようとします。 OPが説明した問題は、OWINパイプラインとAspNET Identityを実装した瞬間にアプリケーションにヒットしました。

それを修正する方法を見てみましょう...

  1. OWINスタートアップ

私はあなたがそれを必要とすることを推測します、もしあなたが必要としないなら、あなたは認証を必要としない、そして私はあなたを必要とすると思うそれ以外は、古いスタイルの認証を使用していますが、使用していないと思います。そのため、OWINスタートアップ属性も削除しないでください...

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

...または構成行...

<add key="owin:AppStartup" value="YourApp.Probably_App_Start.SomethingLikeAuthConfig" />
  1. コントローラーのアクセス制限

これをクリアしました。認証が必要です。これは、各コントローラーが[Authorize]属性を必要とするか、モノをグローバルに登録することで1か所ですべてのコントローラーに同じことを行うことができることを意味します(たとえば、RegisterGlobalFilters()filter.Add(new AuthorizeAttribute())行を追加) 。前者の場合(各コントローラーを個別に保護する場合)、この部分をスキップして、次の部分に進んでください。後者の場合、すべてのコントローラーは不正アクセスから保護されるため、その許可のエントリポイント-保護されていないLogin()アクションが必要です。追加するだけで...

[AllowAnonymous]

...そしてあなたは良いはずです。

  1. OWIN Cookieの構成

ユーザーがログインすると、システムの処理を簡素化するために、ブラウザーは暗号化された(できれば!)Cookieを保存します。したがって、Cookieが必要です。UseCookieAuthenticationという行を削除しないでください。

  1. 本当にしなければならないのは、Webアプリケーションの統合認証メカニズムIIS)をオフにすることです。これは、Windows Authentication(無効)をオフにして、少なくともIIS Expressが関係する場合、Anonymous Authentication(有効)を設定することにより、.

Webサイトを開始すると、これらの設定がIIS Express設定(applicationhost.config)]にコピーされ、次の2行が表示されます。

<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

この受け入れられた答えのおかげで同じ問題を解決しました: ユーザーが役割を持たない場合のASP.NETログインリダイレクトループ

Loginアクションを含むコントローラーにはAuthorizeAttribute(カスタムのものも)が付いていますが、loginアクションにはAllowAnonymous属性が付いていません。コントローラーからAuthorizeAttributeを削除し、ログインアクションにAllowAnonymousを追加することが解決策になる場合があります。

1
silviagreen

ウェブサイトにローカルでコールバックするときに無限ループに陥るという同様の問題がありました。ローカルでデバッグするとき、ポートをリダイレクトしていることがわかりました。プロジェクトのプロパティ画面でポート番号を更新しましたが、Azureの定義をクラウドプロジェクトで同じままにして、すべてが期待どおりに動作し始めました。

0
Steve Newton

私の場合、それは非常に有線の問題でした、私は存在しない役割でホームコントローラーを飾りました。そのため、リダイレクトループが発生します。

0
Baouche Iqbal

Asp.Net MVC 4プロジェクトでも同じ問題が発生しました。 Startup.csに移動し、ConfigureAuth(app)の行をコメントアウトして解決しました。

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

また、プロジェクトでIISでWindows認証を有効にし、他のすべての認証オプションを無効にしました。

0
AndeeC

私にとって、これは翻訳リソースファイルへの参照を含むLoginViewModelが原因であり、明らかに認証によって保護されていることが原因でした。これらの参照を削除し、問題は解決しました。

0
MichaelCleverly

私にとっては、removing以下のブロックがそれを修正しました:

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

仮定する

<authentication mode="None" />
0
emragins