天道酬勤,学无止境

How to authorize SignalR Core Hub method with JWT

I am using JWT authentication in my ASP.NET Core 2.0 application with OpenIddict.

I am following idea in this thread and calling AuthorizeWithJWT method after SignalR handshake. But now, I do not know what should I set in AuthorizeWithJWT method so I can use [Authorize(Roles="Admin")] for example.

I tried with setting context user, but it is readonly:

public class BaseHub : Hub
{    
    public async Task AuthorizeWithJWT(string AccessToken)
    {
        //get user claims from AccesToken
        this.Context.User = user;  //error User is read only
    }
}

And using authorize attribute:

public class VarDesignImportHub : BaseHub
{
    [Authorize(Roles = "Admin")]
    public async Task Import(string ConnectionString)
    {
    }
}

评论

I strongly encourage you to continue doing authentication at the handshake level instead of going with a custom and non-standard solution you'd implement at the SignalR level.

Assuming you're using the validation handler, you can force it to retrieve the access token from the query string:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication()
        .AddOAuthValidation(options =>
        {
            options.Events.OnRetrieveToken = context =>
            {
                context.Token = context.Request.Query["access_token"];

                return Task.CompletedTask;
            };
        });
}

Or OnMessageReceived if you want to use JWTBearer:

services.AddAuthentication()
    .AddJwtBearer(o =>
    {
        o.Events = new JwtBearerEvents()
        {
            OnMessageReceived = context =>
            {
                if (context.Request.Path.ToString().StartsWith("/HUB/"))
                    context.Token = context.Request.Query["access_token"];
                return Task.CompletedTask;
            },
        };
    });

No other change should be required.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • JWT authentication in SignalR (.NET Core) without passing token in Query String
    I am using JWT authentication tokens in an ASP .NET Core Web API application. The tokens are generated by the API itself, not by a third party. I added SignalR sucessfully to the stack, but now I need to authenticate the users that are trying to execute server (Hub) methods. Someone suggested to pass the token in the "qs" property in JavaScript. This will not work for me as our tokens are really large (they contain lots of claims). I tried writing a custom middleware for reading the token from the payload and auto-authenticating the user. The problem is that, when using WebSockets, the
  • Call SignalR Core Hub method from Controller
    How can I call SignalR Core Hub method from Controller? I am using ASP.NET Core 2.0 with Microsoft.AspNetCore.SignalR (1.0.0-alpha2-final). I have windows service which communicate with Excel, SolidEdge ... When operation is complete it post request to my controller in ASP.NET Core application. Now I need to inform all clients connected to server with SignalR that external program completed some task. I can not change the way window service works. (Can not connect to SignalR from window service). I found plenty solution for old SignalR (GlobalHost.ConnectionManager.GetHubContext), but much has
  • SignalR无法读取未定义的属性客户端(SignalR cannot read property client of undefined)
    问题 我正在尝试将SignalR添加到我的项目(ASPNET MVC 4)中。 但是我不能使它工作。 在下图中,您可以看到我收到的错误。 我已经阅读了很多stackoverflow帖子,但是都没有解决我的问题。 这是我到目前为止所做的: 1) Ran Install-Package Microsoft.AspNet.SignalR -Pre 2) Added RouteTable.Routes.MapHubs(); in Global.asax.cs Application_Start() 3) If I go to http://localhost:9096/Gdp.IServer.Web/signalr/hubs I can see the file content 4) Added <modules runAllManagedModulesForAllRequests="true"/> to Web.Config 5) Created folder Hubs in the root of the MVC application 6) Moved jquery and signalR scripts to /Scripts/lib folder (I'm not using jquery 1.6.4, I'm using the latest) 这是我的Index.cshtml
  • ASP.NET Core RC2 SignalR Hub Context outside request thread
    I am currently trying out the RC2 release of ASP.NET Core and I am running into an issue with SignalR. I need to be able to send messages to the client outside of the request thread. Now in the full .NET framework you can do this like: var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.<SendMessage>() But in ASP.NET Core there is no GlobalHost. I found a similar question: How to get SignalR Hub Context in a vNext Project? Where the second answer provides a method to get the hubcontext outside the request thread, but this also does not work in ASP.NET Core. So my
  • 在Typescript中使用ASP.NET Core SignalR和React创建实时应用程序
    目录 介绍 ScrumPoker应用程序 源代码 开发工具 基本步骤 后端代码 创建Hub 在Startup中注册集线器 创建持久性 让我们为客户端应用程序公开一些终端 启用Cors 前端代码 结论 SignalR现在包含在ASP.NET Core框架中,并且进行了大量改进,使其轻巧易用。令我惊讶的是,我找不到任何有关如何使用SignalR的好教程,并且无法使用它使相同的旧聊天应用程序变得有趣。我想到了用SignalR创建一些东西,而不是同一个无聊的聊天应用程序。 介绍 在本教程中,我将指导您完成创建实时应用程序所需的主要步骤。我不会在这里写完整的代码。您可以在github 上找到完整的源代码。 ScrumPoker应用程序 在本教程中,我们将创建一个有趣的应用程序,名为ScrumPoker。我们生活在敏捷的世界中,因此在我们的开发过程或每个冲刺周期中进行故事评估并指出要点很普遍。过去,我们曾经计划使用扑克牌,而团队则通过这些牌来进行故事评估,但是现在一切都在线上了,我们经常进行远程工作。 用户可以创建ScrumBoard链接并与队友共享链接。团队成员可以进入那里并开始指出故事。只有当创建的用户ScrumBoard允许他们查看时,团队给出的点才会显示在仪表板上。 用户会实时添加到仪表板上,他们提交的点也会实时反映出来。 源代码 ├───clientapp├───Contracts├
  • ASP.NET Core中基于令牌的身份验证(Token Based Authentication in ASP.NET Core)
    问题 我正在使用ASP.NET Core应用程序。 我正在尝试实施基于令牌的身份验证,但无法弄清楚如何为我的案例使用新的安全系统。 我浏览了一些示例,但是它们并没有太大帮助,它们使用cookie身份验证或外部身份验证(GitHub,Microsoft,Twitter)。 我的情况是:angularjs应用程序应该请求/token url传递用户名和密码。 WebApi应该授权用户并返回access_token ,它将由angularjs应用程序在以下请求中使用。 我找到了一篇很棒的文章,内容涉及在当前版本的ASP.NET中完全实现我所需要的-使用ASP.NET Web API 2,Owin和Identity进行基于令牌的身份验证。 但是对我来说,如何在ASP.NET Core中执行相同的操作并不明显。 我的问题是:如何配置ASP.NET Core WebApi应用程序以与基于令牌的身份验证一起使用? 回答1 .Net Core 3.1更新: David Fowler(ASP .NET Core团队的架构师)汇集了一组非常简单的任务应用程序,其中包括演示JWT的简单应用程序。 我很快将把他的更新和简单化的风格结合到这篇文章中。 已针对.Net Core 2更新: 此答案的先前版本使用RSA; 如果生成令牌的相同代码也正在验证令牌,则实际上是没有必要的。 但是,如果要分配职责
  • 将简单的喷射器与SignalR一起使用(Using Simple Injector with SignalR)
    问题 我以为使用SignalR可以很直接地使用自己的IoC,也许是这样。 最有可能我做错了什么。 到目前为止,这是我的代码: private static void InitializeContainer(Container container) { container.Register<IMongoHelper<UserDocument>, MongoHelper<UserDocument>>(); // ... registrations like about and then: var resolver = new SimpleInjectorResolver(container); GlobalHost.DependencyResolver = resolver; } 然后是我的课: public class SimpleInjectorResolver : DefaultDependencyResolver { private Container _container; public SimpleInjectorResolver(Container container) { _container = container; } public override object GetService(Type serviceType) { return _container
  • 您网站上的多个signalR连接/集线器(Multiple signalR connections/hubs on your website)
    问题 如果我有多个页面可以使用多个中心类,那么管理此问题的最佳方法是什么? 例如: 导航到网站上的另一个页面并从本质上“重新打开”与上一页中打开的同一集线器类的连接是否不好? 我是否认为在页面上打开多个集线器连接是正确的,因为即使它们是不同的集线器类,它们也都统一在一个连接中? 回答1 您可以有多个集线器在您的站点上共享一个连接。 SignalR 2.0已更新,可以通过一个信号连接处理多个集线器,而不会降低性能。 官方文档:http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#multiplehubs 所有客户端将使用相同的URL与您的服务建立SignalR连接(“ / signalr”或您的自定义URL(如果您指定了一个)),并且该连接用于该服务定义的所有集线器。 与在单个类中定义所有集线器功能相比,多个集线器没有性能差异。 回答2 要开始使用集线器,请阅读集线器和集线器的客户端的WIKI条目。 根据多个页面的上下文,有几件事情。 启动集线器时,它将为您的客户提供一个ID,该ID在多个页面上都与该集线器相同(可以通过示例进行确认)。 重新打开与同一集线器的连接也不错。 您可能在所有页面上都运行hub.start客户端方法,但是,如果一个客户端打开多个窗口或从一个页面转到另一个页面
  • Connection ID when calling SignalR Core Hub method from Controller
    This is a follow-up to another question and answer. What's the effect of calling HubContext.Clients.Caller or HubContext.Clients.Others from the controller? I see it depends on the connection ID. What value would it have in this situation? If the connection ID (and thus Caller and Others) is invalid then (from within the controller action) how could I obtain a connection ID (for the client currently calling the Web API) that I could use with HubContext.Clients's methods?
  • 如何在ASP.NET Core中获取SignalR Hub上下文?(How to get SignalR Hub Context in a ASP.NET Core?)
    问题 我正在尝试使用以下命令获取中心的上下文: var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); 问题是没有定义GlobalHost。 我看到它是SignalR.Core dll的一部分。 目前,我在项目.json文件中的依赖项中包含以下内容: "Microsoft.AspNet.SignalR.Server": "3.0.0-*" 如果我添加Core的最新可用版本: "Microsoft.AspNet.SignalR.Server": "3.0.0-*", "Microsoft.AspNet.SignalR.Core" : "2.1.2" 我收到很多错误,因为服务器和核心冲突。 如果我将它们都更改为都使用版本“ 3.0.0- *”,则所有冲突都将消失,但是找不到GlobalHost。 如果我删除服务器,而仅使用用户核心版本2.1.2,则GlobalHost可以工作,但是所有其他需要服务器的东西显然都不能。 有任何想法吗? 回答1 Microsoft.AspNet.SignalR.Infrastructure.IConnectionManager是一种DI注入服务,通过它可以获取集线器上下文...例如: using Microsoft.AspNet.SignalR; using
  • 通过http标头SignalR传递令牌(Passing token through http Headers SignalR)
    问题 我可以看到HubConnection中有一个选项,可以通过来自客户端的url请求传递参数。 有什么方法可以通过JS或.NET客户端的http标头传递特定令牌? 回答1 没有使用JS或.NET客户端为SignalR请求设置HTTP标头的简便方法,但是您可以在查询字符串中添加参数,这些参数将作为每个SignalR请求的一部分发送: JS客户端 $.connection.hub.qs = { "token" : tokenValue }; $.connection.hub.start().done(function() { /* ... */ }); .NET客户端 var connection = new HubConnection("http://foo/", new Dictionary<string, string> { { "token", tokenValue } }); 在集线器内,您可以通过上下文访问社区名称: Context.QueryString["token"] 进行持久连接时,也可以添加到查询字符串中。 编辑:现在可以在某些评论者指出的.NET SignalR客户端上设置标头。 在.NET客户端上设置标题 var connection = new HubConnection("http://foo/"); connection.Headers.Add(
  • How to use shared SignalR Hub from different hosted project in ASP.NET Core 2.2
    I'm working with a project built with ASP.NET Core 2.2. The main solution contains multiple projects, which includes API, web and other class libraries. We've used SignalR to displaying shared messages/notifications between the API project and the web project. For example, adding a new employee record from an API should call SignalR Hub and all the web client should received the notification. Here is the current structure of our project |- API |- Hub_ClassLibrary |- Services |- Web Flow: Web > services > Hub API > services > Hub Hub: public class NotificationHub : Hub { public async Task
  • SignalR call client methods from outside the Hub class AspNetCore
    I'm trying to call client methods outside the hub on SignalR, the link below shows how to do this in the old version, although i'm unsure how to do this in the SignalR ASP.NET Core version. I've found a reference to a old post and using a reference to Microsoft.AspNetCore.SignalR.Infrastructure.IConnectionManager although this namespace doesn't seem to existing anymore. An example would be great? Old version: How to call client methods and manage groups from outside the Hub class
  • 如何在Android中使用Signalr(How to use signalr in Android)
    问题 我正在尝试将signalR集成到android应用中,但是没有运气。 我一直在研究各种链接,但没有一个提供有关实现的适当信息。 我有以下问题。 SignalR集成必须在服务/意图服务内部完成吗? 如果我们想通过相同的调用方法接收响应,那么如何获得? 我添加了三个库,即signalr android , signalr client和gson但无法理解代码的工作原理,没有适当的文档可用来理解代码。 提出了一些问题,但没有太多信息 Android Studio中的SignalR无法使用Android中的SignalR实现p2p聊天 如果有人对本机应用程序的信号处理有经验,那对我会非常有帮助。 更新 public class SignalRService extends Service { private static final String TAG = "Service"; private HubConnection mHubConnection; private HubProxy mHubProxy; private Handler mHandler; // to display Toast message private final IBinder mBinder = new LocalBinder(); private SharedPreferences sp;
  • SignalR cannot read property client of undefined
    I'm trying to add SignalR to my project (ASPNET MVC 4). But I can't make it work. In the below image you can see the error I'm receiving. I've read a lot of stackoverflow posts but none of them is resolving my issue. This is what I did so far: 1) Ran Install-Package Microsoft.AspNet.SignalR -Pre 2) Added RouteTable.Routes.MapHubs(); in Global.asax.cs Application_Start() 3) If I go to http://localhost:9096/Gdp.IServer.Web/signalr/hubs I can see the file content 4) Added <modules runAllManagedModulesForAllRequests="true"/> to Web.Config 5) Created folder Hubs in the root of the MVC application 6
  • How to get SignalR Hub Context in a ASP.NET Core?
    I'm trying to get the context for a hub using the following: var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); The problem is that GlobalHost is not defined. I see it is part of the SignalR.Core dll. At the moment, I have the following in my project .json file, under dependencies: "Microsoft.AspNet.SignalR.Server": "3.0.0-*" If I add the latest available version of Core: "Microsoft.AspNet.SignalR.Server": "3.0.0-*", "Microsoft.AspNet.SignalR.Core" : "2.1.2" I get a whole bunch of errors because server and core are conflicting. If I change them to both use version "3.0.0-*
  • 我可以同时包含SignalR和RESTful API吗?(Can I incorporate both SignalR and a RESTful API?)
    问题 我有一个使用ASP.NET开发的单页Web应用程序。 最近,我使用SignalR库将许多Web方法转换为基于推送的方法。 这确实大大加快了页面速度,并减少了该页面中的许多服务器调用。 同时,我也一直在研究一些服务器端方法的RESTful ASP.NET WebAPI,其真正的美在于,它允许在我开发RESTful ASP.NET WebAPI的同时为外部应用程序创建API。核心应用程序(这对我正在做的事情很重要)。 但是,在看了几篇文章和这两个问题之后,push和WebAPI方法似乎是客户端-服务器通信的两个完全不同的范例。 我确定我可以创建可以通过任一协议访问的各种方法,但是我不确定是否存在陷阱或认为这很草率-也许有一种更优雅的方法可以实现我的目标为了。 当然,在某些情况下,我希望RESTful WebAPI通过SignalR集线器广播事件...相反(SignalR曾经需要访问WebAPI)似乎不太可能,但我想仍然可能。 有人做过吗? 有人对如何进行有任何建议或提示吗? 在这里,最优雅的前进方向是什么? 回答1 观看此博客文章中的视频。 它准确地解释了如何将WebAPI与SignalR一起使用。 本质上,Web API + SignalR集成包含在此类中: public abstract class ApiControllerWithHub<THub>
  • Asp.Net Core 3.1 SignalR 启动配置变化
    一、Asp.Net Core 3.1 SignalR 启动配置变化 在.net Core 3.1版本不少的api使用方式发生变化。 在Asp.net Core 3.1中SignalR配置方式如下: using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using SignalRChat.Hubs; namespace SignalRChat { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public
  • 引用项目中的地图中心(map hubs in referenced project)
    问题 http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-host 就我而言,我的集线器位于一个项目中,该项目引用了启动自托管应用程序的项目代码。 在线connection.Start().Wait(); 我有一个例外。 以下是在该行引发的异常序列: 指定的注册表项不存在System.IO.IOException 无法解析“ MessageHub”集线器InvalidOperationException 远程服务器返回错误:(500)Internal Server Error WebException 引用项目中消息中心类的签名是public class MessageHub : Hub 。 更新:为了测试该理论,我将集线器类从引用的项目移到了我的测试项目中,并更新了名称空间。 有效。 因此,我认为这里的理论是正确的...默认的中心分辨率无法在引用的项目或单独的命名空间中找到中心。 如何说服MapHubs在引用的项目中找到测试中心? 回答1 我想我已经找到了答案。 在仔细研究了源代码之后,SignalR似乎使用以下方法来指定IAssemblyLocator来定位集线器。 internal static RouteBase
  • 如何在中心线之外使用SignalR集线器实例(How to use SignalR hub instance outside of the hubpipleline)
    问题 我正在使用SignalR向所有客户广播消息。 我需要在集线器类之外触发广播,例如以下内容: var broadcast = new chatHub(); broadcast.Send("Admin","stop the chat"); 我收到以下错误消息: 不支持使用不是由HubPipeline创建的Hub实例。 回答1 您需要使用GetHubContext : var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>(); context.Clients.All.Send("Admin", "stop the chat"); 有关详细信息,请参见http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromouthub。 回答2 对于那些可能想知道GlobalHost去哪里的人的一个小更新。 SignalR已针对.net核心进行了完全重写。 因此,如果您使用SignalR.Core包(SignalR版本之间的差异),则可以通过将SignalR集线器上下文注入服务中来获得一个实例: public class MyNeedyService { private readonly