web-dev-qa-db-ja.com

Asp.netコアIDがログインに成功し、ログインページにリダイレクトされます

ユーザーが正常にログインした後、asp.netIDフレームワークがユーザーをログインページにリダイレクトするという問題があります。

これは、標準のAsp.netコアIDを使用しています。バージョン2.1.1です。かみそりのページを生成する足場。それが重要かどうかはわかりません。

ログメッセージが表示されるので、ユーザーが正常にログインしていることがわかります

... Areas.Identity.Pages.Account.LoginModel:情報:ユーザーがログインしました。

ただし、その後、ログインページに直接リダイレクトされます。

フィドラーを使用すると、リクエストにCookieが含まれていることがわかります。そのため、その観点からはすべて問題ないように見えます。

.AspNetCore.Identity.Application=CfDJ8KJxkuir9ZJIjFLCU2bzm9n6X...

では、認証を処理しているがCookieを受け入れていないミドルウェアだと思いますか?

認証用の実際のミドルウェアが何をしているかを見ることができれば、私は考えを持っているかもしれませんが、それを見つけることができません。

助けていただければ幸いです

6
Jero

ASP.NET Coreパイプラインにユーザーがサインインしていることを認識させるには、UseAuthenticationクラスのConfigureメソッドでStartupを呼び出す必要があります。そう:

app.UseAuthentication();
app.UseMvc(); // Order here is important (explained below).

Cookie認証スキームを使用すると、UseAuthenticationを使用すると大まかに次のようになります。

  • リクエストから.AspNetCore.Identity.Application Cookieのコンテンツを読み取ります。これは、リクエストを行っているユーザーのIDを表します。
  • UserHttpContextプロパティに、そのユーザーを表すClaimsPrincipalを入力します。

これは何が起こるかを簡単に説明したものですが、認証ミドルウェアが実行する重要な仕事を強調しています。認証ミドルウェアがないと、.AspNetCore.Identity.Applicationはユーザーの認証に使用されないため、ユーザーは認証されません。あなたの場合、ユーザーがサインインしている(つまり、Cookieが設定されている)にもかかわらず、パイプラインミドルウェア(MVCなど)はこのユーザーを認識しない(つまり、Cookieが読み取られていない)ため、認証されていない要求を認識し、ログインする。

認証ミドルウェアがCookieを読み取り、その後ClaimsPrincipalにデータを入力することを考えると、UseAuthentication呼び出しもbeforeUseMvcでなければならないことは明らかです。これが正しい順序で発生するように呼び出します。それ以外の場合、MVCミドルウェアは認証ミドルウェアの前に実行され、入力されたClaimsPrincipalでは機能しません。

ログインを処理するミドルウェアを追加しないと、なぜログインに失敗するのですか?!?

ミドルウェアはログインを処理しません-認証プロセスを処理します。ユーザーhasログインしました。これは、.AspNetCore.Identity.ApplicationCookieの存在によって確認されます。ここで失敗しているのは、そのCookieの読み取りです。

10
Kirk Larkin

app.UseAuthentication(); app.UseMvc();

これはすでに私のコードにありましたが、同じ問題に直面していました。しかし、問題は私の場合はChromeブラウザにありました。mozillaのような他のブラウザで動作していました。クリアした後、Chromeでも動作し始めますすべてのクッキーと現金。

1
Gopal Dahal

順序は重要であることに注意してください。私はこれらを逆にして、元のポスターが経験したのとまったく同じ問題を経験しました。私がこれを理解する前に何時間も無駄になりました...

    app.UseAuthentication();
    app.UseAuthorization();
1
John81

@Kirk Larkinに加えて、.net core 3を使用している場合の回答(今回はプレビューバージョンです)

「app.UseEndpoints」をstartup.csのコードブロックの最後に配置します。

たとえば、この順序である必要があります

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
0