特定の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
認証オプションでLoginPathを具体的に設定しています。デフォルトでは、アクセスしようとしたリソースに関係なく、認証されていない場合は常にそこに誘導されます。 LoginPathをリクエストしたリソースに基づいて動的にするために、いくつかの内部を置き換えたり、継承/オーバーライドしたりする必要があると思います。そうでない場合、動的LoginPathがネイティブでサポートされているかどうかわかりません。私は間違っている可能性があります。
関連のないセキュリティノートでは、ReturnUrlのリソースがアプリケーションに対してローカルであることを確認してから、それを使用するか、アプリのホームページに戻る必要があります。そうしないと、不正なURLがリダイレクトの場所を偽装して、実際の場所を模倣するように設計されたリソースになりすます可能性がありますが、悪意があります。
if (Url.IsLocalUrl(returnUrl))
return Redirect(returnUrl);
else
return RedirectToAction("Index", "Home");
彼らはそれを.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>
そして、それは今順調に動作します!
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に基づいてアクセス拒否されたログインをリダイレクトする方法?