Razor 页面的基于角色的授权

Role based Authorization for Razor Pages

在 asp.net 核心中,可以很容易地为页面和文件夹定义 razor 页面授权,如下所示:

services.AddMvc()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AuthorizePage("/Contact");
        options.Conventions.AuthorizeFolder("/Private");
        options.Conventions.AllowAnonymousToPage("/Private/PublicPage");
        options.Conventions.AllowAnonymousToFolder("/Private/PublicPages");
    });

我的问题是我想在我的项目中使用角色,但我找不到定义允许哪些角色查看页面内容的方法。

我尝试使用授权属性,但它不适用于 Razor Pages。

AuthorizePage 可以使用第二个参数来定义将用于确定当前用户是否可以看到指定页面的策略。我是这样使用的:

services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Admin"));
});

services.AddMvc()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AuthorizePage("/Index", "RequireAdministratorRole");
    });

问题是它仍然不起作用。就像我没有定义政策一样。当我登录时,我可以看到该页面,当我未登录时,它会将我重定向到登录表单。

我还需要做些什么才能让它发挥作用吗?

我发现哪里不对了。为了在我从角色中删除用户后应用更改,我必须注销并再次登录,以便框架刷新用户允许查看的内容。

这确实是个问题,因为如果用户具有管理员角色并且出于某种原因我们想要阻止他访问敏感数据,那么在他注销之前我们无法阻止他。

当我从他的帐户中删除角色时,有没有办法刷新用户的权限?

重新启动应用程序并没有取消他的权限。刷新权限的唯一方法是在他注销时。

这是因为用户的 cookie 仍然有效。 Here is more explanation to it here with a solution。虽然它在 ASP.NET 中,但相同的概念应该适用于您的 Razor Pages 项目: