【问题标题】:ASP.Net MVC Custom Authorization Policy Provider in razor view剃刀视图中的 ASP.Net MVC 自定义授权策略提供程序
【发布时间】:2020-01-22 07:32:53
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我不知道什么对你不起作用,但这就是你可以使用 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 是需求本身。

    作为documented:

    AuthorizeAsync(ClaimsPrincipal, Object, IEnumerable<IAuthorizationRequirement>)
    

    检查用户是否满足 指定资源

    【讨论】:

    • 感谢您的详细解释。我仍然不太确定这是否是我正在寻找的。在控制器中,我使用我的自定义策略提供程序,如下所示:[MinimumAgeAuthorize(15)](不是[Authorize("SomePolicy")][Authorize(Role = "SomeRole")])。这将如何转化为剃刀观点?我做不到@if ((await _authorizationService.AuthorizeAsync(User, "MinimumAgeAuthorize(15)")).Succeeded) - 另请参阅我更新的问题
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多