Microsoft.Identity.Web 和 ASP.NET Core SignalR JWT 身份验证

2023-12-04

我正在使用 ASP.NET Core 制作一个 Web 应用程序,该应用程序还使用 SignalR Core 来提供实时功能。我使用 Azure AD B2C 进行用户管理。我已经成功使用了Microsoft.Identity.Web (https://github.com/AzureAD/microsoft-identity-web)使用 Azure AD B2C 生成的令牌来保护我的 API 终结点。

我想对我的 SignalR Core 集线器做同样的事情。该文档读取将适当的注释添加到您的集线器/方法中,我已经这样做了。 SignalR 的客户端库将访问令牌添加为查询参数,必须在 ASP.NET Core 应用程序的配置中手动提取该参数并将其添加到上下文中,如下所示。

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.Events = new JwtBearerEvents
        {
            OnMessageReceived = context =>
            {
                var accessToken = context.Request.Query["access_token"];

                // If the request is for our hub...
                var path = context.HttpContext.Request.Path;
                if (!string.IsNullOrEmpty(accessToken) &&
                    (path.StartsWithSegments("/hubs/chat")))
                {
                    // Read the token out of the query string
                    context.Token = accessToken;
                }
                return Task.CompletedTask;
            }
        };
    });

但是,这似乎与提供的配置不兼容Microsoft.Identity.Web, here:

        services
            .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAdB2C"));

我怎样才能让 SignalR 与Microsoft.Identity.Web?


应该这样做:

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(configuration);

services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
    Func<MessageReceivedContext, Task> existingOnMessageReceivedHandler = options.Events.OnMessageReceived;
    options.Events.OnMessageReceived = async context =>
    {
      await existingOnMessageReceivedHandler(context);

      StringValues accessToken = context.Request.Query["access_token"];
      PathString path = context.HttpContext.Request.Path;

      // If the request is for our hub...
      if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/hubs"))
      {
        // Read the token out of the query string
        context.Token = accessToken;
      }
    };
});

您可以通过这种方式配置 JwtBearerOptions 对象,而不是添加 JwtBearer。

改编自本文档:https://github.com/AzureAD/microsoft-identity-web/wiki/customization

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

Microsoft.Identity.Web 和 ASP.NET Core SignalR JWT 身份验证 的相关文章

随机推荐

  • 什么是 WindowInsets?

    我正在尝试了解 Android 操作系统 当我阅读 Google I O 2014 应用程序时 我遇到了WindowInsets 如果有人可以解释它们是什么 那么这将是一个很大的帮助 谢谢 WindowInsets是应用于窗口的系统视图 例
  • python 子类化:TypeError object.__new__() 不带参数

    好吧 我又被难住了 不过这应该很容易 我正在尝试对 pytables 类进行子类化tables IsDefinition 如下 import tables class doc tables IsDescription def init se
  • {Java} Vaadin 14 - 检测用户离开(关闭选项卡、f5 等)

    我目前正在使用Vaadin 流版本 14 https github com vaadin platform releases tag 14 0 0 我运行 Java 版本 1 8 0 231 64 位 我只是希望能够检测 在 java 中
  • 我正在尝试将多个蜘蛛的结果存储到 MySQL 中的单独表中

    这是我的 pipelines py 我有两只蜘蛛 一只叫 bristol py 一只叫 Bath py 当我运行 scrapycrawl bristol 时 它会自动将结果添加到名为 Bristol 的 MySQL 数据库表中 我想运行 s
  • 扫描特定服务 CBUUID 时找不到外围设备

    当我使用时 CBUUID uuid CBUUID UUIDWithString 1800 GAP DEBUG LOG CBUUID uuid CBUUID Generic Access Profile centralMan CBCentra
  • Delphi - 在运行时解析 JSON 数据时发生访问冲突

    我是论坛新手 如果我的帖子格式不正确或未遵循指南 请深表歉意 我会很快 得到 这是我的问题 看看下面的代码 我已经删除了几乎所有无关的部分 以将注意力集中在一个关键行上 LParts LJsonObj Get parts JsonValue
  • Cocoa应用程序系统重启

    您知道有什么方法可以通过代码强制重新启动 Mac OS 计算机吗 我尝试了一个小的 applescript 代码 但没有结果 应用程序要求用户关闭 以便用户可以停止重新启动过程 Regards 官方的方式是向登录窗口进程发送系统事件 苹果技
  • 如何在 C# Windows 窗体应用程序中的数据 gridview 中进行搜索?

    我有一个表单 其中一个简单的 gridview 由数据库中的表填充 其中包含 TicketID 名称 公司 产品等列 现在我想添加搜索功能 以便用户可以按客户名称或公司或 TicketID 进行搜索 我怎样才能做到这一点 我想在数据网格上方
  • 使用来自 URL 列的 importXML 和 arrayformula 在 google 工作表中返回相同的重复结果

    我已成功使用 ImportXML 获取 Youtube 视频的标题以及 Google Sheets 中的 URL 这是我的代码 IF ISBLANK A3 A IMPORTXML A3 A id eow title 但是 当我尝试在 Imp
  • 机架 ssl 不适用于 Thin

    我按照以下说明为 Rails 3 07 安装了rack ssl http www simonecarletti com blog 2011 05 configuring rails 3 https ssl 它不起作用 发出第一个 https
  • 快速比较两个结构的值

    我有两个结构体和两个与之对应的数组 我试图比较这两个数组值并将其打印在一个过滤数组中我确实尝试过使用过滤器 但它给了我一个错误我想比较结构体和获取一个数组 结构一 struct One let ID String let name Stri
  • 由于警告和 ValueError,无法在 Windows 的 virtualenv 中 pip 安装 PIL

    我正在尝试安装PIL在 virtualenv 中但失败了 我创建了一个全新的 virtualenv 并做了pip install PIL并得到以下结果 C Users s3z Desktop My Dropbox pythons ham g
  • 计算 iOS 中的电池寿命

    想知道除了苹果技术统计数据之外是否还有其他参考资料来计算电池寿命 我尝试比较一些现有的电池应用程序 剩余电池百分比 苹果的数据 但有时我没有得出相同的答案 另外还有使用 2G 电池 而不是 3G 的统计数据 我在 Apple 上没有看到任何
  • 如何为另一个使用 stdin 输入的函数编写测试函数?

    作为大学作业的一部分 我有以下职能 int readMenuOption local declarations char option 2 read in 1 char from stdin plus 1 char for string t
  • 播放音频并继续播放

    我正在用 C 在 unity 5 中制作一个小游戏 到目前为止 我已经成功设计了关卡并完成了一些基本的脚本编写 目前 我有一个触发器 可以生成一个对象 并希望它在用户输入后播放并播放音频源 然而 因为我希望它是一个跳跃恐慌 所以触发器非常小
  • Boost Python 1.48 在导出 32 位枚举时失败

    较新版本的 Boost Python 是否支持从 C 导出完整的 32 位枚举 我使用的是 1 48 并且能够导出最多 30 位 但当我尝试导出 32 位数字时 由于 访问冲突读取位置 0x00000001 每次都会失败 深入研究 enum
  • ValueError:值的长度与索引的长度不匹配 |熊猫 DataFrame.unique()

    我正在尝试获取新的数据集 或将当前数据集列的值更改为其唯一值 这是我想要得到的示例 A B 0 1 1 1 2 5 2 1 5 3 7 9 4 7 9 5 8 9 Wanted Result Not Wanted Result A B A
  • 为什么有些 php 文件不以右括号“?>”结尾? [复制]

    这个问题在这里已经有答案了 我一直在使用 Wordpress 和其他 CMS 我注意到一些 php 文件没有结束语 gt 当我编写自己的文件时 我必须包含 gt 否则软件崩溃 我想知道他们是如何让它工作的 或者主题的特定部分是否接受这种类型
  • 如何知道文件复制完成

    我正在使用 ReadDirectoryChangesW 来监视一个文件夹 如果我将一个大文件复制到该文件夹 我可以收到多个 FILE ACTION MODIFIED 消息 似乎每次 Windows 写入一大块文件时 您都会收到每个文件修改的
  • Microsoft.Identity.Web 和 ASP.NET Core SignalR JWT 身份验证

    我正在使用 ASP NET Core 制作一个 Web 应用程序 该应用程序还使用 SignalR Core 来提供实时功能 我使用 Azure AD B2C 进行用户管理 我已经成功使用了Microsoft Identity Web ht