剃刀视图中的ASP.Net MVC自定义授权策略提供者

时间:2019-09-21 16:06:41

标签: c# model-view-controller asp.net-core-mvc authorization asp.net-authorization

对于某些应用程序,我需要一个自定义的授权策略提供程序,并遵循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)

在“剃刀”视图中相当于什么?

1 个答案:

答案 0 :(得分:1)

我不知道什么对您不起作用,但这就是您可以使用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,value为policyname。当我添加策略MyPermission时,它将检查值为permission的声明类型MyPermission

在视图中:

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

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

更新

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

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

其中MinimumAgeRequirement是需求本身。

documented

AuthorizeAsync(ClaimsPrincipal, Object, IEnumerable<IAuthorizationRequirement>)
  

检查用户是否满足以下特定要求   指定资源