使用 IdentityServer 承载的 SignalR 不会从集线器接收任何 JWTBearerEvents
SignalR using IdentityServer bearer won't receive any JWTBearerEvents from Hub
我们有一个 api (.net core 2.2),它对所有工作正常的控制器使用 IdentityServerAuthenticationDefaults.AuthenticationScheme
。
我们现在决定为会议服务添加 SignalR Hub。
仅当我们删除授权属性 [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme)]
时,集线器才能正常工作
我们确实尝试使用以下两种方法处理查询中的令牌 (TokenRetriever 或 JwrBearerEvents) :
services.AddAuthentication()
.AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Authority = AuthURL;
options.SupportedTokens = SupportedTokens.Jwt;
options.RequireHttpsMetadata = HttpsSetting;
options.ApiName = APIs.API_Commerce;
options.TokenRetriever = new Func<HttpRequest, string>(req =>
{
var fromHeader = TokenRetrieval.FromAuthorizationHeader();
var fromQuery = TokenRetrieval.FromQueryString();
return fromHeader(req) ?? fromQuery(req);
});
options.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/")))
{
// Read the token out of the query string
context.Token = accessToken;
}
return Task.CompletedTask;
};
});
出于某种原因,这些仅在我们调用控制器时触发,但忽略所有从客户端调用的方法。
请注意,我们有一个提供令牌的 AuthServer 和一个 API。
我们在客户端使用 angular 7 和 aspnet/signalr 模块。
我发现了问题...
- app.UseAuthentication() 添加到 Configure
将默认方案添加到身份验证并删除 onmessagereceive ->
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
})
.AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Authority = AuthURL;
options.SupportedTokens = SupportedTokens.Jwt;
options.RequireHttpsMetadata = HttpsSetting;
options.ApiName = APIs.API_Commerce;
options.TokenRetriever = new Func<HttpRequest, string>(req =>
{
var fromHeader = TokenRetrieval.FromAuthorizationHeader();
var fromQuery = TokenRetrieval.FromQueryString();
return fromHeader(req) ?? fromQuery(req);
});
});
只是提一下.net core 2.2 你必须指定一个来源(withOrigins)并且不能使用 Any..
我们有一个 api (.net core 2.2),它对所有工作正常的控制器使用 IdentityServerAuthenticationDefaults.AuthenticationScheme
。
我们现在决定为会议服务添加 SignalR Hub。
仅当我们删除授权属性 [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme)]
我们确实尝试使用以下两种方法处理查询中的令牌 (TokenRetriever 或 JwrBearerEvents) :
services.AddAuthentication()
.AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Authority = AuthURL;
options.SupportedTokens = SupportedTokens.Jwt;
options.RequireHttpsMetadata = HttpsSetting;
options.ApiName = APIs.API_Commerce;
options.TokenRetriever = new Func<HttpRequest, string>(req =>
{
var fromHeader = TokenRetrieval.FromAuthorizationHeader();
var fromQuery = TokenRetrieval.FromQueryString();
return fromHeader(req) ?? fromQuery(req);
});
options.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/")))
{
// Read the token out of the query string
context.Token = accessToken;
}
return Task.CompletedTask;
};
});
出于某种原因,这些仅在我们调用控制器时触发,但忽略所有从客户端调用的方法。
请注意,我们有一个提供令牌的 AuthServer 和一个 API。 我们在客户端使用 angular 7 和 aspnet/signalr 模块。
我发现了问题...
- app.UseAuthentication() 添加到 Configure
将默认方案添加到身份验证并删除 onmessagereceive ->
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; }) .AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme, options => { options.Authority = AuthURL; options.SupportedTokens = SupportedTokens.Jwt; options.RequireHttpsMetadata = HttpsSetting; options.ApiName = APIs.API_Commerce; options.TokenRetriever = new Func<HttpRequest, string>(req => { var fromHeader = TokenRetrieval.FromAuthorizationHeader(); var fromQuery = TokenRetrieval.FromQueryString(); return fromHeader(req) ?? fromQuery(req); }); });
只是提一下.net core 2.2 你必须指定一个来源(withOrigins)并且不能使用 Any..