SignalR 和 OpenId Connect
SignalR and OpenId Connect
我有一个使用 ASP.NET Core Web Api
和 OpenIddict
作为授权框架的服务器。现在我已经添加了一个 SignalR
主机并想为其添加授权。
从 different sources 我发现 SignalR
(JS 客户端)希望您在查询字符串中或通过 cookie 发送访问令牌,因为 websockets 不支持 headers。
由于身份验证中间件不检查查询字符串或 cookie 容器中的授权条目,因此我需要实现这样一个 provider/retriever/resolver,它自己读取此值。
我找到了 solution for IdentityServer
,但没有找到 OpenIddict
。
Where/How 我要用 OpenIddict
实现这样的令牌解析器吗?
如果你使用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>"];
}
就像提到的@adem-caglin一样,在 IdentityserverAuthentication 中你使用 TokenRetriever 并且如果你想要的是标准承载 header 或查询字符串,则可以使用 built-in 函数
TokenRetriever = (request) =>
{
// by default calls TokenRetrieval.FromAuthorizationHeader()(request);
// check if request is to signalr endpoint and only then apply FromQueryString
return TokenRetrieval.FromQueryString()(request);
}
我有一个使用 ASP.NET Core Web Api
和 OpenIddict
作为授权框架的服务器。现在我已经添加了一个 SignalR
主机并想为其添加授权。
从 different sources 我发现 SignalR
(JS 客户端)希望您在查询字符串中或通过 cookie 发送访问令牌,因为 websockets 不支持 headers。
由于身份验证中间件不检查查询字符串或 cookie 容器中的授权条目,因此我需要实现这样一个 provider/retriever/resolver,它自己读取此值。
我找到了 solution for IdentityServer
,但没有找到 OpenIddict
。
Where/How 我要用 OpenIddict
实现这样的令牌解析器吗?
如果你使用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>"];
}
就像提到的@adem-caglin一样,在 IdentityserverAuthentication 中你使用 TokenRetriever 并且如果你想要的是标准承载 header 或查询字符串,则可以使用 built-in 函数
TokenRetriever = (request) =>
{
// by default calls TokenRetrieval.FromAuthorizationHeader()(request);
// check if request is to signalr endpoint and only then apply FromQueryString
return TokenRetrieval.FromQueryString()(request);
}