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

jos*_*ibu 1 c# model-view-controller authorization asp.net-authorization asp.net-core-mvc

对于某些应用程序,我需要一个自定义授权策略提供程序,并点击此链接,并能够成功创建一个在控制器中工作的授权策略提供程序。现在,当涉及到视图时,在基于角色的授权中,您可以简单地使用该术语@if (User.IsInRole("SomeRole"))来显示或隐藏 div 和资源。

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

我搜索了网络,找不到有关它的有用信息,并尝试与

@if ((await AuthorizationService.AuthorizeAsync(User, "PolicyName")).Succeeded)
Run Code Online (Sandbox Code Playgroud)

但这也并不成功——它也不是一项政策。

以前有人这样做过吗?

更新

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

[MinimumAgeAuthorize(15)]
public IActionResult Index()
{
       //some code
}
Run Code Online (Sandbox Code Playgroud)

我不能做

@if ((await AuthorizationService.AuthorizeAsync(User, "MinimumAgeAuthorize(15)")).Succeeded)
Run Code Online (Sandbox Code Playgroud)

在剃刀视图中它的等价物是什么?

小智 6

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

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

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

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

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

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService _authorizationService

@if ((await _authorizationService.AuthorizeAsync(User, "MyRolePolicy")).Succeeded)
{
}
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,策略将添加为权限(如果不存在),其中 Claimtype 为permission,value 为策略名称。当我添加策略时,它将检查value 的MyPermissionClaimtype 。permissionMyPermission

视图中:

@if ((await _authorizationService.AuthorizeAsync(User, "MyPermission")).Succeeded)
{
}
Run Code Online (Sandbox Code Playgroud)

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

更新

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

@if ((await _authorizationService.AuthorizeAsync(User, null, new MinimumAgeRequirement(15))).Succeeded)
Run Code Online (Sandbox Code Playgroud)

其中MinimumAgeRequirement 是要求本身。

记录

AuthorizeAsync(ClaimsPrincipal, Object, IEnumerable<IAuthorizationRequirement>)
Run Code Online (Sandbox Code Playgroud)

检查用户是否满足指定资源的一组特定要求