web-dev-qa-db-ja.com

ASP.NETコア、未承認のデフォルトリダイレクトの変更

ASP.NET MVC6で別のログインURLにリダイレクトしようとしています

アカウントコントローラーのログインメソッドには、URLを変更するRoute属性があります。

[HttpGet]
[AllowAnonymous]
[Route("login")]
public IActionResult Login(string returnUrl = null)
{
    this.ViewData["ReturnUrl"] = returnUrl;
    return this.View();
}

カスタマイズされていないページにアクセスしようとすると、無効なURLにリダイレクトされます。/loginになりますが、代わりにhttp://localhost/Account/Login?ReturnUrl=%2Fhome%2Findexが返されます。

Cookie認証パスを次のように構成しました。

services.Configure<CookieAuthenticationOptions>(opt =>
{
    opt.LoginPath = new PathString("/login");
});

すべてのURLがデフォルトで認証を要求するように、デフォルトのフィルターを追加しました。

services.AddMvc(
    options =>
    {
        options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
    });

URL /loginが実際にログインページをロードするのに対し、/account/loginはロードしないことを確認しました。

編集:ルートをそのままにしておきました(デフォルトのコントローラーとアクションの変更は別として)

app.UseMvc(routes =>
{
    routes.MapRoute(
      name: "default",
      template: "{controller=Site}/{action=Site}/{id?}");
});
26
Jim

UseIdentity拡張メソッド ここ をチェックすると、IdentityOptionsではなくCookieAuthenticationOptionsを使用していることに気付くので、代わりにIdentityOptionsを構成する必要があります。

services.Configure<IdentityOptions>(opt =>
{
    opt.Cookies.ApplicationCookie.LoginPath = new PathString("/login");
});

編集

Asp.netコア2.0の場合:ID CookieオプションはIdentityOptionsの一部ではなくなりました。 mxmissileの answer を確認してください。

14
tmg

asp.net core 2.0現在、これは次のように変更されました。

services.ConfigureApplicationCookie(options => options.LoginPath = "/Account/LogIn");

ここに2.0に移行 の詳細。そして さらに詳しい情報 2.0から2.1への移行について。

38
mxmissile

更新:ドットネットコア2.1.xの時点で、IdentityはSDKから足場化されています。 @mxmissile回答に共同署名するには、パスを指定できます。トリックパスを実現するには、高度なルーティングまたはリダイレクトと組み合わせます。 Scaffold Identity

6
daviesdoesit

StatusCodePagesを使用してみることもできます。

app.UseStatusCodePages(async context => {
    var response = context.HttpContext.Response;

    if (response.StatusCode == (int)HttpStatusCode.Unauthorized || 
        response.StatusCode == (int)HttpStatusCode.Forbidden)
        response.Redirect("/Error/Unauthorized");
});
4
Serj Sagan

asp.net core 2.0 IdentityなしでCookieを使用する場合:

app.UseAuthentication();

// If you don't want the cookie to be automatically authenticated and assigned HttpContext.User, 
// remove the CookieAuthenticationDefaults.AuthenticationScheme parameter passed to AddAuthentication.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => 
    {
        options.LoginPath = "/Account/LogIn";
        options.LogoutPath = "/Account/LogOff";
    });

ソース

2
Stas Boyarincev

実際の例では、Serj Saganのソリューションはお勧めしません。これは開発時に完璧に機能しますが、誤解を招く可能性のあるさまざまなタイプのユーザーが使用する実際のアプリケーションに対しては機能します。以下のシナリオを見てみましょう

  1. 認証済みです
  2. 特定のページのURLを知っている
  3. 私はそのページにアクセスする権限がありません

これは、認証されていないかのようにログインページにリダイレクトされることを意味しますが、そうではありません。私はmxmissileソリューションをもっと使います

個人的にはAddMvcCoreを使用していますが、カミソリビューを使用している場合はAddRazorViewEngineを、カミソリページを使用している場合はAddRazorPagesを追加する必要があります。

        services.AddMvcCore(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .AddRazorViewEngine()
        .AddAuthorization()
        .AddJsonFormatters();
1
Aktorius

特にCookie認証方式を使用している場合は、認証サービスを追加するときにstartup.csでこれを構成する必要があります。

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options => 
        {
            options.LoginPath = new PathString("/login");
        }); 

これは私が問題を解決した方法でした、あなたはそれを試してみる必要があります...それは間違いなくあなたのために働くでしょう

1
Stephen Enunwah