web-dev-qa-db-ja.com

asp.netコアでの戻りURLの操作

特定のURLへのアクセス中にユーザーが認証/承認されていない場合、ユーザーを(リターンURLを使用して)ログインページにリダイレクトしようとしています。ただし、ユーザーをログインページにリダイレクトするときに、カスタムパラメータ(この場合はクライアント名)をルートに追加することはできません。 asp.netアイデンティティコアフレームワークを使用しています。

Startup.csで、すべてに適用できる以下のルートを定義しました。

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "Edge",
                    template: "{clientname}/{controller}/{action}");
            });

すべてのURLに認証が必要であることを確認するために、コード行の下にも追加されました

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

ログインページにリダイレクトするためにIdentityOptionsを次のように構成しました

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

以下のアカウントコントローラーにはログインメソッドがあります

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

ユーザーが認証なしでURLにアクセスしようとすると、ログインページにリダイレクトされます。例として、以下のHome ControllerからのIndexメソッドを検討してください。

public IActionResult Index()
{
    return View();
}

しかし、ユーザーをログインページにリダイレクトしようとするたびに、URLにクライアント名が追加されません。 /Account/Loginでclientnameが欠落しているURLの下に形成されます

http://localhost:5002/Account/Login?ReturnUrl=/ClientA/home/index

このため、404 Page not foundエラーが発生します。適切なリダイレクトを行うために必要な変更は何ですか。

URLは次のように作成する必要があります

http://localhost:5002/ClientA/Account/Login?ReturnUrl=/ClientA/home/index
6
XamDev

認証オプションでLoginPathを具体的に設定しています。デフォルトでは、アクセスしようとしたリソースに関係なく、認証されていない場合は常にそこに誘導されます。 LoginPathをリクエストしたリソースに基づいて動的にするために、いくつかの内部を置き換えたり、継承/オーバーライドしたりする必要があると思います。そうでない場合、動的LoginPathがネイティブでサポートされているかどうかわかりません。私は間違っている可能性があります。

関連のないセキュリティノートでは、ReturnUrlのリソースがアプリケーションに対してローカルであることを確認してから、それを使用するか、アプリのホームページに戻る必要があります。そうしないと、不正なURLがリダイレクトの場所を偽装して、実際の場所を模倣するように設計されたリソースになりすます可能性がありますが、悪意があります。

if (Url.IsLocalUrl(returnUrl))
    return Redirect(returnUrl);
else
    return RedirectToAction("Index", "Home");
10
Nick Albrecht

彼らはそれを.Net Core MVCで変更したようです

それが私にとってどのように機能したか:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = "")
{
    ....... other codes

    if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
       return Redirect(returnUrl);
    else
       return RedirectToAction("Index", "Home");
}

次にHTML Razorコードに移動します。

@{
    ViewData["Title"] = "Login";
    Layout = "~/Views/Shared/_Layout.cshtml";
    var returnUrl = @Context.Request.Query["returnurl"];
}

<form asp-action="Login" asp-route-returnurl="@returnUrl">
   <!--Rest of your login page HTML -->
</form>

そして、それは今順調に動作します!

7
Ali Adravi

Eventsを使用してリクエストを取得し、このサンプルのようなURLにリダイレクトできます。

services.ConfigureApplicationCookie(options => {

            options.Events = new Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents
            {
                OnRedirectToLogin = ctx =>
                {
                    var requestPath = ctx.Request.Path;
                    if (requestPath.Value == "/Home/About")
                    {
                        ctx.Response.Redirect("/Home/UserLogin");
                    }
                    else if (requestPath.Value == "/Home/Contact")
                    {
                        ctx.Response.Redirect("/Home/AdminLogin");
                    }

                    return Task.CompletedTask;
                }
            };

        });

このリンクを参照してください: ASP.NET Core 2 IdentityのURLに基​​づいてアクセス拒否されたログインをリダイレクトする方法?

1
MSL