ASP.Net Razor 视图中的 MVC 自定义授权策略提供程序

ASP.Net MVC Custom Authorization Policy Provider in razor view

对于某些应用程序,我需要一个自定义授权策略提供程序并遵循 this link 并且能够成功创建一个在控制器中运行的程序。现在说到视图,在基于角色的授权中,您可以简单地使用术语 @if (User.IsInRole("SomeRole")) 来显示或隐藏 div 和资源。

如何在视图中使用自定义授权策略提供程序来确定给定用户是否可以根据策略评估看到内容?

我在网上搜索但找不到有关它的有用信息,也试过

@if ((await AuthorizationService.AuthorizeAsync(User, "PolicyName")).Succeeded)

但这也没有成功 - 这也不是一项政策。

以前有人做过吗?

更新

我在控制器中使用自定义策略提供程序如下:

[MinimumAgeAuthorize(15)]
public IActionResult Index()
{
       //some code
}

我做不到

@if ((await AuthorizationService.AuthorizeAsync(User, "MinimumAgeAuthorize(15)")).Succeeded)

razor 视图中它的等价物是什么?

我不知道什么对您不起作用,但这是您可以使用 AuthorizationService 的方式。

对于此示例,我们假设您在启动时定义了一个策略:

services.AddAuthorization(options =>
{
    // assume that claimtype of role is role.
    options.AddPolicy("MyRolePolicy", policy => policy.RequireClaim("role", "SomeRole"));
});

这意味着只有当用户具有 'SomeRole' 角色时才能访问受 'MyRolePolicy' 限制的代码。相当于User.IsInRole("SomeRole").

在视图中为用户注入服务并测试策略:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService _authorizationService

@if ((await _authorizationService.AuthorizeAsync(User, "MyRolePolicy")).Succeeded)
{
}

当您使用自定义授权策略提供程序时,策略是通过中间件添加的,例如:

public class AuthorizationPolicyProvider : DefaultAuthorizationPolicyProvider
{
    public AuthorizationPolicyProvider(IOptions<AuthorizationOptions> options) : base(options)
    {
    }

    public async override Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
    {
        // check static policies first
        var policy = await base.GetPolicyAsync(policyName);

        if (policy == null)
            return new AuthorizationPolicyBuilder().AddRequirements(new PermissionRequirement(policyName)).Build();

        return policy;
    }
}

在此示例中,策略被添加(如果不存在)作为权限,其中 claimtype 是 permission 并且值是 policyname。当我添加策略 MyPermission 时,它将检查值为 MyPermission.

的声明类型 permission

在视图中:

@if ((await _authorizationService.AuthorizeAsync(User, "MyPermission")).Succeeded)
{
}

我不确定您所说的“这也不是一项政策”是什么意思,而是授权政策提供者 returns 政策。因此,您应该能够验证这些策略。无论是简单的声明类型(例如权限或角色)还是带有参数的更复杂的策略。但名称必须匹配。还要确保注入必要的处理程序、服务等。

更新

您还可以使用要求进行验证:

@if ((await _authorizationService.AuthorizeAsync(User, null, new MinimumAgeRequirement(15))).Succeeded)

其中 MinimumAgeRequirement 是要求本身。

作为documented:

AuthorizeAsync(ClaimsPrincipal, Object, IEnumerable<IAuthorizationRequirement>)

Checks if a user meets a specific set of requirements for the specified resource