【问题标题】:how to perform "dry-run" authorization check in .NET Core?如何在 .NET Core 中执行“试运行”授权检查?
【发布时间】:2019-05-29 23:39:31
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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);
        }
    }
    

    【讨论】:

    • 我们最终做了类似的事情,但从客户端调用。无论如何,我们都有授权中间件,所以在调用ShowInformation() 之前调用/auth/CheckPolicy/CanChangeVIPData/ 是一个小的改进。用户信息是“免费”提交的,客户端可以决定是只读显示字段,还是完全阻止用户进入编辑页面。
    【解决方案2】:

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

    【讨论】:

    • 谢谢。这种做法和其他任何做法一样,都有其优点和缺点……不过,我不清楚这与问题有何关系!
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多