.NET WebAPI集中授权

2023-11-29

在 .NET WebAPI 中,我创建了一种将所有授权规则放在一个中央位置的方法,而不是分散在各个控制器中。我很好奇为什么这种集中化没有更频繁地进行;是否有影响/安全问题?

我当前的方法是在 App_Start 期间创建一个字典,其中包含我的所有授权数据,然后使用 DelegatingHandler 来应用限制(代码如下)。字典的键是Controller和Action的元组,值是授权的角色。 DelegatingHandler 与 WebAPI 的路由配置相关联以获取调用哪个控制器,然后使用字典来确定是否允许该请求。

字典:

var authorizations = new Dictionary<Tuple<string, string>, string>();
authorizations.Add(new Tuple<string, string>("values", "get"), "public");
authorizations.Add(new Tuple<string, string>("values", "put"), "private");

委托处理程序:

public class SecurityDelegateHandler : DelegatingHandler
{
    private readonly Dictionary<Tuple<string, string>, string> _authorizations;

    public SecurityDelegateHandler(Dictionary<Tuple<string, string>, string> auth)
    {
        _authorizations = auth;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var config = GlobalConfiguration.Configuration;
        var controllerSelector = new DefaultHttpControllerSelector(config);
        var descriptor = controllerSelector.SelectController(request);

        string restrictions;

        if (!_authorizations.TryGetValue(
                new Tuple<string, string>(descriptor.ControllerName.ToLower(),
                request.Method.ToString().ToLower()), out restrictions))
        {
            return Task<HttpResponseMessage>.Factory.StartNew(() =>
                        request.CreateResponse(HttpStatusCode.Forbidden, 
                        "Access denied on unconfigured actions"), 
                        cancellationToken);
        }

        if (!(Roles.Provider).GetRolesForUser(
               HttpContext.Current.User.Identity.Name).Any(r => 
               restrictions.Contains(r)))
        {
            return Task<HttpResponseMessage>.Factory.StartNew(() => 
                        request.CreateResponse(HttpStatusCode.Forbidden, 
                        "Access Denied"), cancellationToken);
        }

        return base.SendAsync(request, cancellationToken);
    }
}

总之,我的问题是:

  • 以这种方式实现基于角色的授权有什么问题吗?
  • 有没有好的软件包可以处理 Web API 的集中授权?我研究过 Fluent Security,但这似乎不支持WebAPI.

Thanks!


你的方法是一个很好的方法。你应该分开关注点。这意味着将业务逻辑与非功能逻辑/需求(例如日志记录、身份验证,当然还有授权)分开。

之所以没有更广泛地这样做,是因为外部化身份验证或日志记录比外部化与您的业务更相关的授权要容易得多。

如今,不同的编程框架提供外部化授权。 Microsoft 有基于声明的授权,Java 有多个框架,例如Spring Security、SunXACML...PHP 有 Yii、Ruby 有 CanCan...这些框架可以让您实现基于角色的访问控制,甚至基于属性的访问控制。如果您不熟悉这些术语,请查看 NIST 的网页:

  • NIST RBAC
  • NIST ABAC

如果您想要一个技术中立的解决方案,即可以用于 Java、.NET、PHP...的解决方案,您可以使用 XACML(可扩展访问控制标记语言)。它是一个 OASIS 标准,就像 SAML 一样(SAML 专注于联合 ID 和 SSO;XACML 专注于细粒度授权)。您可以在以下位置阅读有关 XACML 的更多信息OASIS网站和维基百科我尝试维护该页面的地方。除了外部化授权之外,XACML 还定义了一种基于策略的授权方法,这是一种非常可扩展的方法。

XACML 有多种开源选项(JBoss、SunXACML、OpenAM...)以及供应商(例如我工作的供应商),公理学.

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET WebAPI集中授权 的相关文章

随机推荐

  • 有没有办法从 CXF 内的 JAX-RS REST 资源访问 CXF 消息交换?

    目前我们有一个使用 CXF 2 4 2 的 RESTful API 在我的一种资源方法中 我想处理一些查询参数并将结果存储在 CXF 消息交换中 以供输出拦截器稍后使用 我已经尝试注入 WebServiceContext 如前所述here
  • 如何在 React Bootstrap Table 中添加水平滚动条?

    我正在使用 React Bootstrap Table 我只想将水平滚动条添加到最后两列 最后两列应包装在可滚动容器中 我们如何实现这一点 const columns dataField id text Product ID dataFie
  • 查找表中每行的顶级父级 [SQL Server 2008]

    我有以下两张表 表人 Id Name 1 A 2 B 3 C 4 D 5 E 表关系层次结构 ParentId CHildId 2 1 3 2 4 3 这将形成一个树状结构 D C B A ParentId 和 ChildId 是 Pers
  • 有没有一种方便的方法可以在 Swing JTable 中使用微调器作为编辑器?

    我处理的数字数据通常会向上或向下编辑 0 01 Value of variable 因此与通常的文本单元格相比 微调器看起来是一个不错的选择 我看过 DefaultCellEditor 但它只接受文本字段 组合框或复选框 有没有方便的方法来
  • 两个已知的 Android 地理位置之间的角度

    我想找到两个已知地理位置之间的角度 基本上我想要的是 我想引导一个箭头 其尾点位于我当前的位置 箭头指向固定的地理位置 所以我在想 如果以某种方式 我能够在这两个地理位置之间获得一个角度 那么我可能也能做同样的事情 你们有什么建议可以更好地
  • Python 和 sqlite3 抛出错误:sqlite3.OperationalError:靠近“s”:语法错误

    我正在尝试使用 Python 和 BeautifulSoup 来抓取一些网络信息 迭代它 然后将一些片段插入 sqlite3 数据库中 但我不断出现这个错误 TBTscrape 中的文件 Users Chris Desktop BS4 TB
  • Azure:跨多个资源组共享资源

    是否可以在多个资源组之间共享特定资源 在我的例子中是 redis 缓存 资源组只是逻辑容器 资源位于哪个资源组中并不重要 您可以使用任何资源组中的资源 Example 假设您在 RG1 中创建应用服务计划 并在 RG2 中创建 Web 应用
  • Swift 3 中是否可以在不自动布局的情况下降低键盘的高度?

    我需要以编程方式降低键盘的高度 我有什么办法可以做到吗 我发现我们可以使用键盘扩展来降低高度 但我尝试过 但它对我不起作用 我有什么办法可以做到这一点吗 Edit But i can see small keyboards in some
  • 如何替换字符串的某些部分?

    如何用另一部分替换字符串的某一部分 输入字符串 Hello my name is Santa 我怎样才能改变一切a在我的字符串中还有其他东西吗 我想我需要一个foreach循环 但我不确定如何使用它 strtr str array a gt
  • java下载文件时如何检测网络断开?

    我正在使用以下代码使用 Java 下载文件 但我想检测连接何时丢失 我运行了以下代码 在下载过程中我故意断开了互联网连接 但没有引发异常并且挂起 即使打开连接后也没有任何反应 于是 它就永远挂了 没有任何例外 有没有办法让它在连接丢失时抛出
  • 我可以仅在底部椭圆化剪贴蒙版吗?

    我正在尝试在 CSS 中的图像上创建弯曲的剪贴蒙版 该曲线本质上只是一个非常宽的椭圆的下半部分 要求是角度 曲率不会根据图像的高度 宽度而改变 它应该始终保持一致 这是一个视觉效果 尝试1 边框半径 溢出隐藏 固定宽度 问题 图像高度影响曲
  • 为什么“cut”反对我的标签?

    我试图根据值所属的范围来标记值 就像你对作业评分一样 因此 如果我有一个平均测验分数的数据框和一个数值数据框 我将其用作为这些平均值分配分数的下限 grades lt read table text Student Mean Adam 94
  • 私人运营商删除[重复]

    这个问题在这里已经有答案了 可能的重复 公共运算符 new 私有运算符删除 使用 new 时出现 C2248 无法访问私有成员 http efesx com 2009 12 01 public operator new and privat
  • jQuery addClass 方法链接以执行 CSS 转换

    我想做的事 broke div div
  • 通过java App查看PDF

    我想知道如何通过 Java 应用程序查看 PDF 我正在尝试创建一个应用程序来使用 NetBeans 6 8 查看 PDF 很少有 pdf 阅读器库 例如 iText pdfBox 但他们没有帮助我 请帮我 任何帮助都是感激的 谢谢你 这里
  • Spring集成:使用oubound网关处理http错误

    如何处理 http 出站网关中的异常 当我收到状态代码 500 或 400 时 会显示异常 那么我应该如何使用 spring 集成来处理 http 错误 我的配置是这样的
  • 将 JSON 从 ajax 发布到 Struts2 Action

    嘿 我正在尝试将 JSON 从 Ajax 发布到 Struts2 操作类方法 更多信息 我在 WAMP 服务器上运行客户端 在 Eclipse Tomcat 上运行 Struts2 我的客户端代码
  • Vue.js项目中添加Tailwind.css后,某些类没有效果

    我正在尝试将 Tailwind css 添加到 Vue js 项目中 有很多关于如何执行此操作的资源 其中大多数都遵循与这个视频 为了确保我处于与视频中相同的条件 我从头开始创建了一个 Vue 应用程序 使用vue cli使用默认预设 完成
  • 使用脚本在 Powershell 命令提示符中填写多个答案

    我正在尝试使用 Powershell 脚本自动填写提示的答案 提示问题如下所示 这些问题由 cmd 文件一个接一个地生成 这意味着输入不会返回到 Powershell 输入 我找到了很多答案来一次回答一个问题或多个是 否问题 但还没有这样的
  • .NET WebAPI集中授权

    在 NET WebAPI 中 我创建了一种将所有授权规则放在一个中央位置的方法 而不是分散在各个控制器中 我很好奇为什么这种集中化没有更频繁地进行 是否有影响 安全问题 我当前的方法是在 App Start 期间创建一个字典 其中包含我的所