在ASP.NET Core中,在哪里配置重定向到登录



我正在学习这里提供的示例:

  • 在没有ASP.NET核心标识的情况下使用cookie身份验证
  • AspNetCore.Docs/AspNetCore/security/authentication/cookie/samples/3.x/CookieSample/

我正在尝试在自己的应用程序中实现类似的功能。示例应用程序的大部分功能都有效,正如在我的应用程序中复制的那样,但有一个关键功能无效。

在这个示例应用程序中;Contact(Authentication Required(";链接,当点击时加载"/联系人";页面-如果用户已登录。

如果用户没有登录;Contact(Authentication Required(";链接仍然将其href=设置为"/"联系人";,但当你点击它时/帐户/登录;控制器,ReturnUrl设置为"/联系人";。

";主页";链接指向Index.chtml,并且重定向到/Account/Login";如果用户未登录。

这一切都很普通,除了。。。我找不到重定向到/Account/Login的配置位置,也无法确定为什么我们在一个页面上重定向,而在另一个页面不重定向。

是什么导致Contact重定向到Login,而Home重定向到not,我在哪里配置要重定向到的帐户/登录名?


Rakib的评论让我看到了YouTube上的一段视频,同一系列中的一段早期视频暗示了我的一个问题。

ConfigureServices((中的示例应用程序具有:

services.AddRazorPages(options =>
{
options.Conventions.AuthorizePage("/Contact");
});

所以这就是为什么"/联系人";需要身份验证。但我仍然不知道是什么设置了"/帐户/登录;当您需要身份验证时,将其作为URL。

第1部分

是什么导致Contact重定向到Login而不是Home?

  • 如果页面或控制器配置为允许匿名,则不会重定向到登录
[AllowAnonymous]
public class HomePage : PageModel
{
//...
}
  • 如果页面/文件夹或区域仅通过[Authorize]属性或在startup.cs中配置为授权用户,则如果用户未登录,则会将其重定向到登录页面
[Authorize]
public ContactModel : PageModel
{
// ...
}

以下是启动时授权的示例配置,其中我们为角色名称Admins:创建了一个名为RequireAdmins的基于角色的策略

services.AddRazorPages()
.AddRazorPagesOptions(ops =>
{
ops.Conventions.AuthorizeAreaFolder("Panel", "/", "RequireAdmins");
ops.Conventions.AuthorizeFolder("/", "RequireAdmins");
ops.Conventions.AllowAnonymousToAreaPage("Identity", "/Account/AccessDenied");
});
services.AddAuthorization(ops =>
{
ops.AddPolicy("RequireAdmins", policy => policy.RequireRole("Admins"));
});

第2部分

我在哪里配置要重定向到的帐户/登录名?

配置可以在启动时完成,通常我会创建一个自定义身份验证cookie:

public class XCookieAuthEvents : CookieAuthenticationEvents
{
public override Task RedirectToLogin(RedirectContext<CookieAuthenticationOptions> context)
{
context.RedirectUri = $"/Identity/Account/CustomLogin";
return base.RedirectToLogin(context);
}
public override Task RedirectToLogout(RedirectContext<CookieAuthenticationOptions> context)
{
context.RedirectUri = $"/Identity/Account/CustomLogout";
return base.RedirectToLogout(context);
}
public override Task RedirectToAccessDenied(RedirectContext<CookieAuthenticationOptions> context)
{
context.RedirectUri = $"/Identity/Account/CustomAccessDenied";
return base.RedirectToAccessDenied(context);
}
public override Task RedirectToReturnUrl(RedirectContext<CookieAuthenticationOptions> context)
{
context.RedirectUri = $"/CustomReturnUrl";
return base.RedirectToReturnUrl(context);
}
}

然后在启动时注册:

services.AddScoped<XCookieAuthEvents>();
// optional: customize cookie expiration time
services.ConfigureApplicationCookie(ops =>
{
ops.EventsType = typeof(XCookieAuthEvents);
ops.ExpireTimeSpan = TimeSpan.FromMinutes(30);
ops.SlidingExpiration = true;
});

最新更新