Asp.net WebApi 中的自定义授权 - 一团糟?

2023-12-13

我正在阅读有关 Web Api 授权的多个资源(书籍和一些答案)。

假设我想添加仅允许某些用户访问的自定义属性:

Case #1

我见过这种方法压倒性的 OnAuthorization,如果出现问题,它会设置响应

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 public override void OnAuthorization(HttpActionContext actionContext)
  {
   if ( /*check if user OK or not*/)
   {
     actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
   }
  }
}

Case #2

但我也见过这个类似的例子,它也是最重要的OnAuthorization但打电话给base :

public override void OnAuthorization(HttpActionContext actionContext) 
{ 
  base.OnAuthorization(actionContext);

    // If not authorized at all, don't bother

    if (actionContext.Response == null)  
     {
      //...
     }
}

然后,您检查是否HttpActionContext.Response是否设置。如果不设置,则表示请求已授权,用户ok

Case #3

但我也见过这种重写方法IsAuthorized :

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 protected override bool IsAuthorized(HttpActionContext context)
  {
   if ( /*check if user OK or not*/)
   {
    return true;// or false
   }
  }
}

Case #4

然后我看到了类似的示例一,但调用了 base.IsAuthorized(context) :

protected override bool IsAuthorized(HttpActionContext context)
{
 if (something1 && something2 && base.IsAuthorized(context)) //??
 return true;
 return false;
}

还有一件事

最后多米尼克说here :

您不应该覆盖 OnAuthorization - 因为您将缺少 [AllowAnonymous] 处理。

问题

  • 1)我应该使用哪些方法:IsAuthorized or OnAuthorization? (或何时使用哪个)

  • 2)我什么时候应该打电话base.IsAuthorized or基础.OnAuthorization` ?

  • 3)他们就是这样建造的吗?如果响应为空那么一切都好? (案例#2)

NB

请注意,我仅使用(并且想要使用)AuthorizeAttribute它已经继承自AuthorizationFilterAttribute

Why ?

因为我正处于第一阶段:http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

enter image description here

无论如何,我通过扩展 Authorize 属性来询问。


我应该使用哪些方法:IsAuthorized 或 OnAuthorization? ( 或者 何时使用哪个)

你将延长AuthorizationFilterAttribute如果您的授权逻辑不依赖于已建立的身份和角色。对于用户相关的授权,您将扩展并使用AuthorizeAttribute。对于前一种情况,您将覆盖OnAuthorization。对于后一种情况,您将覆盖IsAuthorized。从这些属性的源代码中可以看到,OnAuthorization如果您派生自,则标记为虚拟供您覆盖AuthorizationFilterAttribute。另一方面,IsAuthorized方法被标记为虚拟的AuthorizeAttribute。我相信这是一个很好的指向预期用途的指针。

我什么时候应该调用base.IsAuthorized或base.OnAuthorization?

这个问题的答案在于面向对象的一般工作方式。如果您重写一个方法,您可以完全提供一个新的实现,也可以利用父级提供的实现来增强行为。例如,以IsAuthorized(HttpActionContext)。基类行为是根据过滤器中指定的内容与建立的身份来检查用户/角色。比如说,您想要执行所有这些操作,但除此之外,您还想检查其他内容,可能基于请求标头或其他内容。在这种情况下,您可以提供这样的覆盖。

protected override bool IsAuthorized(HttpActionContext actionContext)
{
    bool isAuthroized = base.IsAuthorized(actionContext);
    // Here you look at the header and do your additional stuff based on actionContext
    // and store the result in isRequestHeaderOk
    // Then, you can combine the results
    // return isAuthorized && isRequestHeaderOk;
}

抱歉,我不明白你的问题 3。顺便说一句,授权过滤器已经存在很长时间了,人们将它用于各种各样的事情,有时甚至是错误的。

还有一件事。最后这里有个家伙说:你 不应该覆盖 OnAuthorization - 因为你会丢失 [AllowAnonymous] 处理。

说这句话的人就是访问控制之神——多米尼克。显然这是正确的。如果你看一下实施OnAuthorization(复制如下),

public override void OnAuthorization(HttpActionContext actionContext)
{
    if (actionContext == null)
    {
        throw Error.ArgumentNull("actionContext");
    }

    if (SkipAuthorization(actionContext))
    {
        return;
    }

    if (!IsAuthorized(actionContext))
    {
        HandleUnauthorizedRequest(actionContext);
    }
}

打电话给SkipAuthorization是确保的部分AllowAnonymous应用过滤器,即跳过授权。如果您重写此方法,您就会失去该行为。实际上,如果您决定将授权基于用户/角色,那么您将决定从AuthorizeAttribute。此时您唯一剩下的正确选择就是覆盖IsAuthorized而不是已经被覆盖的OnAuthorization,尽管技术上两者都是可行的。

附言。在 ASP.NET Web API 中,还有另一个过滤器,称为身份验证过滤器。想法是,您使用它进行身份验证,并使用授权过滤器进行授权,如名称所示。然而,有很多例子表明这个界限是被捏造的。许多授权过滤器示例都会进行某种身份验证。无论如何,如果你有时间并且想了解更多,请看一下这个 MSDNarticle。免责声明:这是我写的。

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

Asp.net WebApi 中的自定义授权 - 一团糟? 的相关文章

  • 用户 ASP.NET 运行于

    我有点困惑 ASP NET 如何在什么用户下运行 在 iis 7 5 和 6 0 上 一些我不清楚的用户帐户是 网络服务 IUSR AppPool 对不同用户的任何澄清以及安全考虑等都将不胜感激 总之 IIS 5 1 Windows XP
  • 数字或货币的字符串格式?

    我需要为每个千给出逗号 所以我用了DataFormatString 0 它运行良好 但当值为0 它正在显示 00 我只想只显示 0 我们怎样才能做到这一点 DataFormatString 0 C0 这将格式化为小数点后 0 位的货币 Da
  • 在 Dapper 中处理 Oracle 数据库连接

    我正在尝试连接到 Oracle 数据库并尝试执行查询 下面是我的模型类 using System using System Collections Generic using System Linq using System Web usi
  • ASP.NET Webform 中的异常处理

    在 ASP NET Webforms 中处理异常的首选方法是什么 你有Page Error您添加的方法 我认为 web config级别 并且当发生错误时整个站点将被重定向到该级别 这是否意味着您不应在 Web 表单应用程序中的任何位置使用
  • 将图像添加到 ASP.Net 中的单选按钮列表

    我正在尝试将图像添加到单选按钮列表控件 但它不起作用 我试过这个 RadioButtonList2 Items Add new ListItem String Format src Colors Dallas 625527 1 1 png
  • 仅在页面加载时执行 Javascript,而不是回发 (SharePoint)

    我正在尝试在 SharePoint 网站上的自定义页面上加载页面时执行一些 JavaScript 它使用当前用户填充人员选择器 问题是代码也在回发时执行 这是我不希望的 因为它会重置人员选择器的任何更改 我尝试过使用if IsPostBac
  • 如何将 .ashx 处理程序与 asp:Image 对象一起使用?

    我有一个 ashx 处理程序 using System using System Web public class Thumbnail IHttpHandler public void ProcessRequest HttpContext
  • 什么可能会在一台服务器上导致此错误,而在另一台服务器上则不会?

    我们有一个连接到外部 Web 服务的 ASP Net 网站 几天前它突然停止工作 基本代码是这样的 Try request New ExternalWebService ProcessRequestService Error occurs
  • 如何使用 Windows 身份验证指定 Windows 用户从 ASP 连接到 MS SQL Server 数据库

    我已经尝试了一个多月的时间来将这里的 ASP 脚本连接到 SQL Server 数据库 但每次我使用这个连接字符串时 Data Source dbServer01 Initial Catalog POS123 Integrated Secu
  • ASP.NET WebApi - 一个控制器中的多个 GET 操作

    I have Users控制器和基本 REST 模式工作得很好 不过我需要一种额外的模式users id usergroups这将返回该用户的所有用户组 实现这一点的最佳方法是什么 因为我想我将需要在更多控制器上使用类似的路由 仅使用默认值
  • 我的机器密钥是自动生成的还是隔离的?

    我正在尝试分享 ASPXAUTHASP NET MVC 4 应用程序 在 IIS 7 5 中 和使用的服务之间的 cookieHttpListener在同一主机上 浏览器正确地向两者呈现 cookie 但我的服务收到System Web H
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • Asp.net错误无法加载文件或程序集[重复]

    这个问题在这里已经有答案了 可能的重复 计算机崩溃后 我的 Visual Studio 2010 将无法加载程序集 https stackoverflow com questions 4975455 after a computer cra
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 在 iFrame 内维护会话状态

    不确定我是否疯了 但我在 iFrame 内的会话状态遇到问题 它是一个域在另一个域中的简单设置 我不需要跨域共享任何内容 我想做的就是将一个网站嵌入到另一个网站中 并且我希望该嵌入网站能够使用 cookie 会话状态登录 编辑 更新 等 为
  • 使用 AttributeRouting.PUTAttribute 时出现 405,除非我还包含 HttpPutAttribute

    我们有一个 MVC 项目 我正在尝试更新该项目以包含 WebApi 为了获得所需的路由 我们使用 AttributeRouting 除了返回 405 的 PUT 之外 所有调用似乎都正确路由 我已经简化了控制器和操作 但仍然收到 PUT 的
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • ASP.NET Click() 事件在第二次回发时不会触发

    我有一个 ASP NET Web 表单 我第一次提交表单时 会引发 提交按钮单击 事件 表单返回到浏览器时可能会出现验证错误 或者可以选择使用新值再次提交表单 当再次提交表单时 提交按钮单击 事件永远不会触发 Page Load 触发 但按

随机推荐

  • 如何删除文本文件的内容而不删除自身

    我想将文件 A 的内容复制到文件 B 复制完成后 我想清除文件 A 的内容并想从头开始写入 我无法删除文件 A 因为它与其他任务相关 我能够使用java的文件API readLine 复制内容 但不知道如何清除文件内容并将文件指针设置到文件
  • 执行包含“/”字符的 vim 替换命令

    我有一个 java 文件 其中写了 t 而不是 t 这是制表符转义函数的正确表示法 我想使用 vim 的替换功能 s 但是当我执行以下操作时 s t t g 我收到错误消息 E488 尾随字符 我怎样才能编写命令以便执行替换 谢谢 使用反斜
  • 找到两组矩阵之间最近的点对

    假设我有两组矩阵 A and B 每个矩阵内部都包含几个点坐标 我想找出其中的点B最近到A并输出元胞数组C相应地列出最近的点对坐标和一个元胞数组D注册未配对的位置 我该怎么做 更具体地说 这就是我想要的 两组矩阵包含点xy坐标 A 1 2
  • 数据框内的 Pandas 转置

    我现在有这个数据 animal age count dogs 1 49 2 134 3 147 4 154 cats 1 189 2 254 3 259 4 261 我想将每个年龄的年龄列转换为 4 个年龄列 animal age1 age
  • 在 Azure AD B2C 中使用状态参数容易遭受开放重定向漏洞吗?

    如果我使用State参数来控制RedirectURI如此处所述 为什么重定向 URL 在 Azure AD B2C 中是完全限定的 我不会容易受到打开重定向漏洞 我不是刚刚把问题从RedirectURI to the State范围 状态参
  • 将未初始化的变量传递给 srand 是个好主意吗?

    将未初始化的变量传递给是个好主意吗srand而不是结果time NULL 这是一个 include并减少一个函数调用 示例代码 include
  • mysqli_error() 需要 1 个参数,0 个给出[重复]

    这个问题在这里已经有答案了 我正在尝试了解 mysql 有人能告诉我为什么这个 mysql 查询不起作用吗 我收到以下错误 警告 mysqli error 需要 正好 1 个参数 0 给出 home freebet2 public html
  • SolrJ:禁用自动提交

    我们有一个 Solr 实例 我们发现在 solrconfig xml 中打开 autoCommit 实际上可以很好地满足我们的需求 但是 在某些实例和某些批处理操作中 我们希望暂时禁用自动提交 我找不到任何东西 但我想知道是否有人知道是否可
  • 如何将 Leaflet 地图嵌入到 Reveal.js 演示文稿中?

    我正在尝试创建一个在 Reveal js 之上运行的演示文稿 其中一张幻灯片中包含一个 Leaflet js 地图 我已将所有必需的 Javascript 和 CSS 文件包含到我的 Reveal js 演示文稿中 并且可以使地图显示在幻灯
  • React-native,动态渲染按钮点击

    我想动态生成一个按钮单击TouchableOpacity在反应本机中 我没有找到任何相关内容 我想要的只是从函数中调用 TouchableOpacity onPress 或查看其对按钮的效果 在钛合金中 我们正在做 button click
  • 无法在 docker 上执行 nvidia 运行时

    我正在尝试让 nvidia docker 在我的 centos7 系统上运行 cat etc systemd system docker service d override conf Service ExecStart ExecStart
  • 将通知链接到闪亮仪表板中的选项卡

    我想将通知链接到 内部 选项卡 为此 我遇到了这个 如何在闪亮的notificationItem中使用href 这似乎在加载应用程序后立即起作用 但在侧边栏中进行一些导航后 链接不再起作用 ui R library shiny librar
  • 如何在java中安全地存储加密密钥? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个 java 属性对象 其中包含 Web 服务的身份验证信息 我需要加密该数据 但我不知道需要在哪里存储加密密钥才能保证其安全 加密这些数据并以安全的方式检索它的最佳实践是
  • 从 AngularJS 指令访问属性

    我的 AngularJS 模板包含一些自定义 HTML 语法 例如
  • 如何在 Django REST 框架的可浏览 API 中编辑图标?

    我需要编辑可浏览 API 的图标 是否可以通过覆盖模板中的 api html 来做到这一点 这可以通过在 api html 中添加以下块来实现 block style block super endblock
  • Swift 3 尝试呈现谁的视图不在窗口层次结构中

    这个问题已被问过很多次 但即使在尝试了大多数可能的事情之后 我仍然无法找到适合我的解决方案 这是错误消息 警告 尝试在 上显示其视图不在窗口层次结构中的内容 注意 我没有使用任何导航控制器 我只是以模态方式呈现一个视图控制器我上面有一个用于
  • C 和 C++ 中的标准头文件列表

    在哪里可以找到 C 和 C 中所有头文件的列表 当我构建库时 我收到类似 tree h not found 我想这是 C 和 C 中的标准头文件 这引起了我想了解所有头文件及其贡献的好奇心 有地方可以找吗 我正在 Solaris Unix
  • 完成后将变量保存在 .awk 文件中以供下次运行

    因此 我有一个 awk 文件 它将一个订单文件拆分为多个订单文件 文件名从orders xml 包含100个订单的主文件 到递增的文件 如order 1 xml order 2 xml order 3 xml等 当 awk文件完成文件分割后
  • 用于添加到收藏夹的精灵或类似效果

    我有一个 iPhone 应用程序 其中包含 全部 和 收藏夹 选项卡 其中包含标准主细节布局 在 全部 选项卡上 用户可以选择 添加到收藏夹 我正在寻找一个好的视觉队列来向用户表明这样做后可以从 收藏夹 选项卡访问该项目 是否存在类似 精灵
  • Asp.net WebApi 中的自定义授权 - 一团糟?

    我正在阅读有关 Web Api 授权的多个资源 书籍和一些答案 假设我想添加仅允许某些用户访问的自定义属性 Case 1 我见过这种方法压倒性的 OnAuthorization 如果出现问题 它会设置响应 public class Allo