SignalR 和 OpenId 连接

Posted

技术标签:

【中文标题】SignalR 和 OpenId 连接【英文标题】:SignalR and OpenId Connect 【发布时间】:2017-04-09 22:11:20 【问题描述】:

我有一个使用ASP.NET Core Web ApiOpenIddict 作为授权框架的服务器。现在我已经添加了一个SignalR 主机,并想为其添加授权。

从different sources 我发现SignalR(JS 客户端)希望您在查询字符串中或通过 cookie 发送访问令牌,因为 websockets 不支持标头。

由于身份验证中间件不检查查询字符串或 cookie 容器中的授权条目,我需要实现这样一个提供者/检索器/解析器,它自己读取此值。

我找到了solution for IdentityServer,但没有找到OpenIddict

在哪里/如何使用OpenIddict 实现这样的令牌解析器?

【问题讨论】:

是this 你想要做什么?它有two levels of middleware 接受查询字符串和标题。 【参考方案1】:

就像@adem-caglin 提到的那样,在 IdentityserverAuthentication 中,您使用 TokenRetriever 并且如果您追求的是标准不记名标头或查询字符串,则可以使用内置函数

TokenRetriever = (request) => 

    // by default calls TokenRetrieval.FromAuthorizationHeader()(request);
    // check if request is to signalr endpoint and only then apply FromQueryString
    return TokenRetrieval.FromQueryString()(request);

【讨论】:

【参考方案2】:

如果你使用JwtBearerAuthentication,那么你可以使用OnMessageReceived来设置token:

Events = new JwtBearerEvents()

   OnMessageReceived = async (ctx) =>
   
        ctx.Token = ctx.Request.Query["<qs-name>"];
   

或者,如果您使用IdentityServerAuthentication,那么您可以使用TokenRetriever(未经测试,但应该是这样的):

   TokenRetriever = (ctx) =>
   
        return ctx.Request.Query["<qs-name>"];
   

【讨论】:

以上是关于SignalR 和 OpenId 连接的主要内容,如果未能解决你的问题,请参考以下文章

基于SignalR的服务端和客户端通讯处理

PushSharp 与 Signal R

将 Signal R 合并到现有的 Web 应用程序中

Signalr 实现心跳包

使用 SIGNAL R 的 Angular 7 和 ASP.NET Core 2.2 的 CORS 策略问题

SignalR入门篇