1

我正在研究此处提供的示例:

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

在此示例应用程序中,有一个“联系(需要身份验证)”链接,单击该链接时会加载“/联系”页面 - 如果用户已登录。

如果用户未登录,“联系人(需要身份验证)”链接的 href= 仍然设置为“/Contact”,但是当您单击它时,您最终会进入“/Account/Login”控制器,并带有 ReturnUrl设置为“/联系人”。

“主页”链接指向 Index.cshtml,如果用户未登录,则不会重定向到“/Account/Login”。

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

是什么导致联系人重定向到登录名和主页而不是,我在哪里配置它是我要重定向到的帐户/登录名?


Rakib 的评论将我指向一个 YouTube 视频,同一系列中的一个早期视频给了我一个关于我的问题的提示。

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

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

所以这就是“/Contact”需要身份验证的原因。但是当您需要身份验证时,我仍然看不到将“/Account/Login”设置为 URL 的内容。

4

1 回答 1

3

第1部分

是什么导致联系人重定向到登录和主页?

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

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

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;
});
于 2021-04-08T20:28:16.730 回答