为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
宝慕林4294392 2023-12-17 10:39:29
对于某些应用程序,我需要一个自定义授权策略提供程序,并按照此链接成功创建了一个可在控制器中运行的授权策略提供程序。现在,当涉及到视图时,在基于角色的授权中,您可以简单地使用术语 @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 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

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


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


services.AddAuthorization(options =>

{

    // assume that claimtype of role is role.

    options.AddPolicy("MyRolePolicy", policy => policy.RequireClaim("role", "SomeRole"));

});

这意味着受“MyRolePolicy”限制的代码;仅当用户具有角色“SomeRole”时才可访问。相当于 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;

    }

}

在此示例中,策略将添加为权限(如果不存在),其中声明类型为 permission,值为策略名称。当我添加政策 MyPermission 时,它将检查声明类型 permission 的值 MyPermission。


视图中:


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

{

}

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


更新

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


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

其中MinimumAgeRequirement 是要求本身。


如记录:


AuthorizeAsync(ClaimsPrincipal, Object, IEnumerable<IAuthorizationRequirement>)

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


查看完整回答
反对 回复 2023-12-17
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信