考虑我拥有具有基于策略的授权的.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
的方法,它将在授权中间件成功或失败之后使管道短路。
答案 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令牌将返回到客户端。然后,客户端根据权限声明呈现页面。