0

考虑到我有具有基于策略的授权的 .NET 控制器:

public class ImportantController: Controller {
    [HttpGet]
    [Authorize(Policy = "CanAccessVIPArea")]
    public IActionResult ShowInformation() {
        ...
        return OK(VipData);
    }

    [HttpPost]
    [Authorize(Policy = "CanChangeVIPData")]
    public IActionResult SaveInformation([FromBody] VipData) {
        ...
        return CreatedAtAction(...);
    }
}

显然,真实的例子要复杂得多。如果我的简化导致过多的虚构,我深表歉意。此外,真正的应用是带有 Angular 前端的 SPA;但我认为这对这个问题没有任何影响。

当用户调用时,ShowInformation()我会显示大量数据。在那个页面上,我有Save调用SaveInformation(). 授权中间件检查正确的策略,一切正常。

问题是当用户按下保存时,她输入了大量数据,却发现她没有保存权限。很明显,导致体验不好。我想检查用户调用ShowInformation时调用的中间件中SaveInformation的权限。我不想检查硬编码策略,因为它在服务器上并且可以更改(我们有非常复杂的权限管理系统,可以在运行时操作权限)。的调用与 Angular 服务在同一个 Angular 服务中,并且很容易检查...SaveInformationShowInformation

我想/api/SaveInformation?dryrun在授权中间件成功或失败后调用类似的方法来短路管道。

4

2 回答 2

1

您可以注入 IAuthorizationService 并要求按名称评估策略:

public class ImportantController: Controller 
{
    private readonly IAuthorizationService authorization;

    public ImportantController(IAuthorizationService authorization)
    {
        this.authorization = authorization;
    }

    public async Task<IActionResult> ShowInformation() 
    {
        // ...
        var result = await authorizationService.AuthorizeAsync(User, "IsLucky"); 

        return OK(VipData);
    }
}
于 2019-05-29T15:39:31.133 回答
0

我的做法是在 id 令牌中包含所有权限声明,当用户首次登录系统时,id 令牌将返回到客户端。客户端然后根据权限声明呈现页面。

于 2019-01-05T05:01:07.077 回答