ASP .NET Core Razor页面中的授权

she*_*rtu 5 c# asp.net-core razor-pages

我无法在ASP .NET Core中实现基于策略的授权,以执行剃须刀页面上的操作。

我通读了有关授权的详尽文档,并以其示例为指导。

剃刀页面动作代码:

[Authorize(Policy = "test")]
public async Task<IActionResult> OnGetCreateAsync(string id)
Run Code Online (Sandbox Code Playgroud)

服务配置中的代码:

_ = services.AddAuthorization(options => {
    options.AddPolicy("test", policy =>
        policy.RequireAssertion(context =>
            false));
});
Run Code Online (Sandbox Code Playgroud)

我希望如果我调用动作或端点服务,例如

GET /Account?handler=Create
Run Code Online (Sandbox Code Playgroud)

那么该请求将以403状态响应被拒绝,因为“测试”策略指出每个人都是未经授权的。但是,在实际中,该操作已成功调用。

akb*_*bar 6

另一种解决方案是通过 if 子句检查身份验证。如下所示:

if (!HttpContext.User.Identity.IsAuthenticated)
    {
      return Redirect("/Front/Index");
    }
Run Code Online (Sandbox Code Playgroud)

roles也可以通过查找角色来检查它:

var user = await _userManager.FindByEmailAsync(model.Email);
var roles = await _userManager.GetRolesAsync(user);
Run Code Online (Sandbox Code Playgroud)


Ogg*_*las 6

我建议遵循 ASP.NET Core 中的 Razor Pages 授权约定,如下所示:

services.AddRazorPages(options =>
{
    options.Conventions.AuthorizePage("/Contact");
    options.Conventions.AuthorizeFolder("/Private");
    options.Conventions.AllowAnonymousToPage("/Private/PublicPage");
    options.Conventions.AllowAnonymousToFolder("/Private/PublicPages");
});
Run Code Online (Sandbox Code Playgroud)

在您的策略情况下,test它看起来像这样:

options.Conventions.AuthorizePage("/Account", "test");
Run Code Online (Sandbox Code Playgroud)

来源:

https://learn.microsoft.com/en-us/aspnet/core/security/authorization/razor-pages-authorization?view=aspnetcore-5.0

支持授权属性,但仅限PageModel于此:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace PageFilter.Pages
{
    [Authorize]
    public class ModelWithAuthFilterModel : PageModel
    {
        public IActionResult OnGet() => Page();
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:

https://learn.microsoft.com/en-us/aspnet/core/razor-pages/filter?view=aspnetcore-5.0#authorize-filter-attribute


Kir*_*kin 5

Razor Pages当前[Authorize]处理程序级别不支持。即你可以只授权一个页面作为一个整体,在PageModel本身。是我可以在文档中找到的最接近的东西:

可以将Authorize属性应用于 PageModel

如果对页面进行整体授权不是可行的解决方案,则可能需要将OnGetCreateAsync处理程序移至控制器/动作对中,并相应地将其归因于[Authorize]

在文档中还有一个与此相关的GitHub问题

[Authorize]自剃刀页2.0过滤器属性已被支持的,但要注意,它工作在页面模型水平