单元测试 AuthorizationHandler

2024-04-10

我在 .NET Core 2.1 中使用了基于资源的授权模式,如下所述。我唯一的问题是我不知道如何测试我的AuthorizationHandler干净地。

这里有人已经做过类似的事情了吗?

AuthorizationHandler示例(来自上面的链接):

public class DocumentAuthorizationHandler : 
    AuthorizationHandler<SameAuthorRequirement, Document>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   SameAuthorRequirement requirement,
                                                   Document resource)
    {
        if (context.User.Identity?.Name == resource.Author)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

public class SameAuthorRequirement : IAuthorizationRequirement { }

所有必需的依赖项都可用于隔离的单元测试。

所需的测试方法HandleRequirementAsync可以通过以下方式访问Task HandleAsync(AuthorizationHandlerContext context) https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authorization/AuthorizationHandler.cs#L49

/// <summary>
/// Makes a decision if authorization is allowed.
/// </summary>
/// <param name="context">The authorization context.</param>
public virtual async Task HandleAsync(AuthorizationHandlerContext context)
{
    if (context.Resource is TResource)
    {
        foreach (var req in context.Requirements.OfType<TRequirement>())
        {
            await HandleRequirementAsync(context, req, (TResource)context.Resource);
        }
    }
}

该成员仅依赖于AuthorizationHandlerContext它有一个构造函数如下

public AuthorizationHandlerContext(
    IEnumerable<IAuthorizationRequirement> requirements,
    ClaimsPrincipal user,
    object resource) {

    //... omitted for brevity
}

Source https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authorization/AuthorizationHandlerContext.cs#L26

简单的隔离单元测试,验证预期的行为DocumentAuthorizationHandler.

public async Task DocumentAuthorizationHandler_Should_Succeed() {
    //Arrange    
    var requirements = new [] { new SameAuthorRequirement()};
    var author = "author";
    var user = new ClaimsPrincipal(
                new ClaimsIdentity(
                    new Claim[] {
                        new Claim(ClaimsIdentity.DefaultNameClaimType, author),
                    },
                    "Basic")
                );
    var resource = new Document {
        Author = author
    };
    var context = new AuthorizationHandlerContext(requirements, user, resource);
    var subject = new DocumentAuthorizationHandler();

    //Act
    await subject.HandleAsync(context);

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

单元测试 AuthorizationHandler 的相关文章

  • 来自 RAZOR 中不同文件夹的 RenderPartial

    我一直在尝试将我的 aspx 页面转换为 cshtml 并且在从另一个文件夹渲染部分页面时遇到问题 我以前做过的事 我认为等价的是 Html RenderPartial Views Inquiry InquiryList cshtml Mo
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • 调用事件,h(args) 与 EventName?.Invoke()

    我总是这样调用事件 void onSomeEvent string someArg var h this EventName if h null h this new MyEventArgs someArg 今天 VS 2015 告诉我这可
  • 使用 stringstreams 将字符串转换为 __uint128_t

    我正在尝试从字符串中提取不同类型的数据 void readHeader char buf BUFFSIZE std istringstream hdr buf uint128 t id client hdr gt gt id client
  • ToLookup 是否强制立即执行序列

    我正在调查可枚举 ToLookup将可枚举序列转换为字典类型数据结构的 API 更多详情可在这找到 https msdn microsoft com en us library system linq enumerable tolookup
  • 尝试使用指向 ODBC DSN 的连接字符串时出现关键字不支持异常

    我为我的 Asp Net MVC 应用程序的数据库访问创建了一个 ODBC DSN 主要原因之一是它可以轻松地将数据库凭据 例如服务器地址 端口 用户名和密码 置于源代码控制之外 而不会妨碍我的发布能力 所以我将连接更改为DSN MyDSN
  • 将 dataGridView 绑定到绑定列表并按文本框过滤行

    我正在开发一个 Winforms 应用程序 并且有一个已经绑定到 dataGridView 的对象的 BindingList 我还有一个 过滤器 文本框 如果它们与文本框文本不匹配 我想从 datagridview 行中过滤掉行 我想以某种
  • 如何测试抽象类的受保护抽象方法?

    我一直在研究测试名为的抽象类的最佳方法TabsActionFilter 我保证继承自的类TabsActionFilter将有一个名为GetCustomer 在实践中 这种设计似乎效果很好 我遇到的一些问题是弄清楚如何测试OnActionEx
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • ThemeInfo 属性有什么用?

    每当我创建新的 WPF 应用程序或 WPF 用户控件库时 AssemblyInfo cs文件包含以下属性 assembly ThemeInfo ResourceDictionaryLocation None where theme spec
  • 执行按钮单击时使 wpf UI 响应

    在我的 wpf c 应用程序中 当用户按下按钮时会执行一个很长的过程 当按下按钮直到执行完整的代码时 窗口将冻结 用户无法在窗口中执行任何其他任务 如何使按钮单击代码作为后台进程 以便窗口响应用户 我尝试过以下方法 但没有成功 privat
  • 将 JSON 转换为数据表

    我有以下格式的 JSON id 10 name User add false edit true authorize true view true id 11 name Group add true edit false authorize
  • 如何通过列名检查MySqlDataReader中的NULL?

    我怎样才能检查NULL开放的价值MySqlDataReader 以下不起作用 它总是击中else if rdr GetString timeOut null queryResult Egresstime Logged in else que
  • 文件/文件夹结构的递归搜索

    我正在尝试为返回文件和文件夹列表的 Web 服务构建递归搜索功能 我创建了这两个方法 因此它们充当递归搜索 它首先获取顶级内容 然后将任何文件添加到 fileList 并将任何子文件夹添加到 subFoldersList 我们传入访问级别
  • 虚拟继承 - 跳过构造函数

    我有以下课程 class Socket Socket Socket SOCKET s class Connection public virtual Socket Connection IP ip 这两个类包含一些纯虚函数和一些非虚函数以及
  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • 在 C# 中调用并排显示窗口

    愚蠢的问题是否有一种简单的方法可以清除桌面 然后打开两个资源管理器窗口并调用 并排显示窗口 任务栏调用 只是想知道 MS 库中是否有 api 可以做到这一点 您可以使用TileWindowsWinAPI 函数通过 p invoke 将所需窗

随机推荐

  • 产品和报价项目之间的概念区别是什么

    涉及班级 Mage Sales Model Quote Item and 法师 目录 型号 产品 我通过监听事件 在购物车添加上 得到了它们 我正在尝试从外部来源更新产品的数量信息 到目前为止 我的代码仅基于产品信息 我不确定这是否正确 报
  • 如何使用 pandas 计算所有列之间的相关性并删除高度相关的列?

    我有一个巨大的数据集 在机器学习建模之前 总是建议您首先应该删除高度相关的描述符 列 我如何计算列wice相关性并删除具有阈值的列 例如删除所有列或描述符具有 gt 0 8 的相关性 它还应该保留减少数据中的标题 示例数据集 GA PN P
  • Web API 2 OData = $format 不起作用:请求始终被忽略

    我有一个 Web API OData 项目 一切都运行良好 我现在尝试使用 format 参数返回 xml 而不是 JSON 而不是指定标头请求 但它不起作用 我尝试过这些方法 http localhost 3845 api Custome
  • Google Apps 脚本用于计算昨天收到的具有特定标签的电子邮件数量,然后将 # 每天保存到电子表格

    基本上就是标题所说的 但我想 1 自动计算我的 Gmail 帐户收到的带有特定标签的电子邮件数量 2 每天数一次 即使是零 3 每天向 Google 电子表格报告 4 所以我可以制作这样的月度报告 日期 日期 日期 10 月总计 平均每天
  • Python Tkinter - 恢复原始默认键绑定

    我正在 Win7 机器上使用 Python 2 7 和 Tkinter GUI 在某些情况下 我想完全覆盖 Tab 键的正常默认行为 但前提是存在某些条件 之后我想恢复到默认行为 请注意 目前我对 Tab 键感兴趣 但在某些时候我可能也需要
  • 表格单元格背景渗透到圆角表格中

    正如可以看到的这个演示 http jsfiddle net ZFYvq 其中表格设置有圆角 特别是右上角和左下角 这些角会被其包含的单元格的背景颜色破坏 我尝试应用一些padding到桌子上 但这并没有帮助 我唯一的选择是添加额外的列和行并
  • 树视图 - 突出显示多个项目

    在 Powerbuilder 中 这里有人知道我如何在树视图上突出显示多个项目吗 Selecteditem 函数没有这样做 我正在寻找 Selectedrow id 正在做的行为 Thanks 我自己没有尝试过 但有一个例子代码交换 htt
  • 使用带有 1 字节变量的 Python struct.unpack

    我该如何使用struct unpack 或 Python 中可用的其他一些函数可以轻松转换one字节变量到Python整数 现在 它是以一种相当蹩脚的方式完成的 file open telemetry dat rb read magic f
  • 对数字字符串映射的字符串进行排序

    我们有一个关于字符串排序的问题 在这种情况下排序不起作用 1 A 1 B 10 A 10 B 9 A 9 B 我们真正想要的是 1 A 1 B 9 A 9 B 10 A 10 B 如果我们将其作为字符串排序 结果将类似于第一部分 如果我们先
  • 在java中旋转图像

    我正在寻找旋转图像 我有一个JInternalFrame其中包含一个JLabel 标签包含图像 旋转图像后 我需要调整内部框架的大小 我当前的代码旋转图像 但图像边缘周围有黑色并且偏离中心 对于如何解决这个问题 有任何的建议吗 public
  • 使用expect进行无人值守(无提示)Homebrew安装

    根据Homebrew安装说明 可以使用以下命令进行安装 ruby e curl fsSL https raw github com Homebrew homebrew go install 这可行 但需要用户输入两次 确认安装并在脚本调用的
  • 在 Ruby 中生成 Paypal 签名“X-PAYPAL-AUTHORIZATION”

    Ruby 中是否有任何库可以生成签名 X PAYPAL AUTHORIZATION 代表通过 paypal Permissions API 授权我们的账户持有人进行调用时需要的标头 我完成了权限流程并获取了所需的访问令牌 tokenSecr
  • 在 Oracle SQL 中从当前日期减去 30 年

    我需要编写一个查询 选择所有出生日期在 30 年前的人 不幸的是 由于我使用的是 Oracle 所以我无法使用DATEADD 功能 我目前已经得到了这个 但显然这不是动态的 并且不会随着时间的推移而改变 SELECT Name DOB FR
  • 无法修改 Dictionary 的返回值,因为它不是变量

    有这样的错误 无法修改 System Collections Generic Dictionary this string 的返回值 因为它不是变量 My code Dictionary
  • Mysql 的 Doctrine 查询

    我想创建一个 Doctrine 查询 Doctrine 2 3 SELECT FROM car WHERE plate like AND datetime BETWEEN 2013 03 13 22 20 18 AND 2013 03 13
  • Ruby 进程之间的共享变量

    我有一个 Ruby 程序 可以加载两个非常大的 yaml 文件 因此我可以通过分叉一些进程来利用多核来提高速度 我尝试过寻找 但我无法弄清楚如何或是否可以在不同的进程中共享变量 以下代码是我目前拥有的 proteins decoyProte
  • 在 Moq 中模拟通用方法而不指定 T

    我有一个接口 其方法如下 public interface IRepo IA
  • Docker Compose 在 v2 中注入链接容器

    在 Docker Compose v1 中 etc hosts文件已使用链接的容器进行更新 例如 cat etc hosts 127 0 0 1 localhost 1 localhost ip6 localhost ip6 loopbac
  • 分布式版本控制系统真的没有集中存储库吗?

    这似乎是一个愚蠢的问题 但是如何在没有服务器可供检出的情况下设置工作目录呢 企业如何保存存储库的安全备份副本 我认为必须有一个中央仓库 但是它到底是如何 分布 的 我一直认为服务器 客户端 SVN 与点对点 GIT 的区别 但我不认为这是正
  • 单元测试 AuthorizationHandler

    我在 NET Core 2 1 中使用了基于资源的授权模式 如下所述 我唯一的问题是我不知道如何测试我的AuthorizationHandler干净地 这里有人已经做过类似的事情了吗 AuthorizationHandler示例 来自上面的