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?}");
});
UseIdentity
拡張メソッド ここ をチェックすると、IdentityOptions
ではなくCookieAuthenticationOptions
を使用していることに気付くので、代わりにIdentityOptions
を構成する必要があります。
services.Configure<IdentityOptions>(opt =>
{
opt.Cookies.ApplicationCookie.LoginPath = new PathString("/login");
});
編集
Asp.netコア2.0の場合:ID CookieオプションはIdentityOptionsの一部ではなくなりました。 mxmissileの answer を確認してください。
更新:ドットネットコア2.1.xの時点で、IdentityはSDKから足場化されています。 @mxmissile回答に共同署名するには、パスを指定できます。トリックパスを実現するには、高度なルーティングまたはリダイレクトと組み合わせます。 Scaffold Identity
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");
});
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";
});
実際の例では、Serj Saganのソリューションはお勧めしません。これは開発時に完璧に機能しますが、誤解を招く可能性のあるさまざまなタイプのユーザーが使用する実際のアプリケーションに対しては機能します。以下のシナリオを見てみましょう
これは、認証されていないかのようにログインページにリダイレクトされることを意味しますが、そうではありません。私はmxmissileソリューションをもっと使います
個人的にはAddMvcCoreを使用していますが、カミソリビューを使用している場合はAddRazorViewEngineを、カミソリページを使用している場合はAddRazorPagesを追加する必要があります。
services.AddMvcCore(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
.AddRazorViewEngine()
.AddAuthorization()
.AddJsonFormatters();
特にCookie認証方式を使用している場合は、認証サービスを追加するときにstartup.csでこれを構成する必要があります。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = new PathString("/login");
});
これは私が問題を解決した方法でした、あなたはそれを試してみる必要があります...それは間違いなくあなたのために働くでしょう