I am unable to get claims because user is not authenticating while connecting to signalr web socket hub. I have sent the token in query string as mentioned here. I want to use multiple JWT scheme configuration. For multiple realms of Keycloak identity with dotnet8 web API. Its not invoking OnMessageReceived event for 2nd realm i.e realm2 in this case.
Here is the code.
var authBuilder = services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
});
authBuilder.AddJwtBearer(o =>
{
o.Authority = ” https://keycloak.example.com/realms/realm1”;
o.Audience = “frontend - client”;
o.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/events")))
{
context.Token = accessToken;
context.Request.Headers.Authorization = "Bearer " + accessToken;
}
return Task.CompletedTask;
},
};
}).AddJwtBearer(“realm2”, o =>
{
o.Authority = ” https://keycloak.example.com/realms/realm2”;
o.Audience = “frontend - client”;
o.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/events")))
{
context.Token = accessToken;
context.Request.Headers.Authorization = "Bearer " + accessToken;
}
return Task.CompletedTask;
},
};
});
Note: it is only working with the default Bearer scheme. Also OnMessageReceived is invoking and Authentication is working in this case.
var authBuilder = services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
});
authBuilder.AddJwtBearer(o =>
{
o.Authority = ” https://keycloak.example.com/realms/realm1”;
o.Audience = “frontend - client”;
o.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/events")))
{
context.Token = accessToken;
context.Request.Headers.Authorization = "Bearer " + accessToken;
}
return Task.CompletedTask;
},
};
});
Need help what I am doing wrong here.