与普通的用户ID检查相比,声明/角色/策略授权的技术优势是什么? [英] What's the technical advantage of claim/role/policy authorization as opposed to plain check of a user's ID?

查看:28
本文介绍了与普通的用户ID检查相比,声明/角色/策略授权的技术优势是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用了具有策略和角色的Identity Server和受保护终结点。这些都反映在我分发给客户端的访问令牌中。今天,我得到了一个建议,与其保护这样的方法:

[Authorize(Policy = "Elevated"), HttpGet("metadata")]
public IActionResult GetTenantMetadata() { ... }

我们可以跳过JWT的role部分,只执行以下操作。

[Authorize, HttpGet("metadata")]
public IActionResult GetTenantMetadata() { ... }

然后,在Startup.cs中,我们将注册一个自定义处理程序,如下所示。

services.AddHttpContextAccessor();
services.AddTransient<IAuthorizationHandler, HeaderHandler>();
然后,将根据令牌中的sub值在处理程序中执行实际的安全性。没有角色,没有范围,什么都没有。在我看来,直觉上似乎不明智的是,让我承担很多责任来创建保护逻辑,而不是依赖入侵检测系统和比我聪明得多的人。我见过的所有解决方案都使用声明和角色来处理安全性。所以我的直觉告诉我这不是个好主意。

protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        CustomRequirement requirement)
    {
        HttpRequest request = Accessor.HttpContext.Request;
        string param = request.Headers.SingleOrDefault(a => a.Key == "param1");
        string someAccess = dbContext.GetAccess(param, context.User.GetUserId());

        bool authorized = SomeEvaluation(param, someAccess);
        if (authorized) context.Succeed(requirement);
        else context.Fail();

        return Task.CompletedTask;
    }

然而,我无法激励自己的选择(除了内脏和其他人的样本),所以最后,我变得不确定。我很谦虚地理解,如果我不能解释为什么,那么可能我错了。

我搜索了基于声明的安全性角色策略安全性等,但我可以为建议的替代方案想出一个名称。因此,我没有找到任何讨论这件事的材料。

这样的自定义授权方法叫什么?它的优点/注意事项是什么?

推荐答案

仍然是声明授权,只是不是一个好/实用的声明:您只使用了sub声明。没有理由丢弃/不使用受信任的身份提供商提供的完全正确的声明。

首先,允许客户端通过标头发送用户ID是一种安全风险。您如何知道它是否被篡改,并且用户没有假装是管理员?您不能,这就是您要求ID提供商对用户进行身份验证并签署令牌以进行身份验证的原因。

其次,精心挑选用户ID并在运行时从数据库或API获取其他用户声明是可行的,但可能并不总是可行的(应用程序不会将用户数据/委托身份验证保留给第三方)或可行的(高流量应用程序,过多的数据库查找)。

要授权操作,可以使用断言声明策略。但对于更高级或更强制的检查,您可以选择实现AuthorizationHandler并强制允许/阻止操作。
它对于基于资源的授权很有用,但是如果您需要的声明已经在访问令牌中提供,那么对于可能是一行代码的内容来说,这是一种过度杀伤力。

详细信息

这篇关于与普通的用户ID检查相比,声明/角色/策略授权的技术优势是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆