NET Core中如何执行“空运行”授权检查?

时间:2019-01-05 00:19:24

标签: asp.net-core .net-core authorization

考虑我拥有具有基于策略的授权的.NET Controller:

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 的权限。我宁愿不检查硬编码策略,因为它在服务器上并且可以更改(我们有相当复杂的权限管理系统,可以在运行时操作权限)。 SaveInformation的调用与ShowInformation在相同的Angular服务中,并且很容易检查...

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

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

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