我正在重构API以使用内置的.Net身份验证代替IdentityServer4
在我的旧代码中,我将身份验证令牌附加到websocket地址,并使用中间件注入标头
public class SignalRQueryStringAuthMiddleware
{
private readonly RequestDelegate _next;
public SignalRQueryStringAuthMiddleware(RequestDelegate next)
{
_next = next;
}
// Convert incomming qs auth token to a Authorization header so the rest of the chain
// can authorize the request correctly
public async Task Invoke(HttpContext context)
{
if (context.Request.Query.TryGetValue("A5S0kT0k", out var token))
{
context.Request.Headers.Add("Authorization", "Bearer " + token.First());
}
await _next.Invoke(context);
}
}
我可以看到中间件正在按预期执行,并附加了适当的授权标头。
但是,在我的创业公司中,我的授权似乎从未被调用过,它直接转变为连接到Websocket'。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(cfg => {
cfg.RequireHttpsMetadata = false;
cfg.SaveToken = true;
cfg.Events = new JwtBearerEvents
{
OnMessageReceived = async (ctx) =>
{
Console.WriteLine(ctx.Token);
},
OnTokenValidated = async (ctx) =>
{
Console.WriteLine("BreakPoint");
},
OnAuthenticationFailed = async (ctx) =>
{
Console.WriteLine("Breakpoint");
}
};
cfg.TokenValidationParameters = tokenValidationParameters;
});
这是我的管道在configure中的执行顺序
app.UseSignalRQueryStringAuth();
app.UseAuthentication();
app.UseSignalR(routes =>
{
routes.MapHub<DefaultServiceHubBase<MessageDTO>>("/messages");
routes.MapHub<DefaultServiceHubBase<ConversationDTO>>("/conversations");
routes.MapHub<InMemoryHub<UserLocationDTO>>("/user-locations");
});
我配置了管道,以便首先使用中间件,但是身份验证我永远无法在JWTBearer部分中遇到任何断点,但是,如果我创建标准的HttpRequest,一切正常吗?
我的OnMessageReceived
被忽略,它直接转到集线器中的onconnect函数,为什么会发生这种情况?
答案 0 :(得分:0)
不知道为什么,但是事实证明我也需要添加默认的质询模式
function sum()
{
var a = parseInt(document.getElementById("num1").value);
var b= parseInt(document.getElementById("num2").value);
var res =document.getElementById("res");
res.value =a+b;
}
function substract()
{
var a = parseInt(document.getElementById("num1").value);
var b= parseInt(document.getElementById("num2").value);
var res =document.getElementById("res");
res.value =a-b;
}
function multiply()
{
var a = parseInt(document.getElementById("num1").value);
var b= parseInt(document.getElementById("num2").value);
var res =document.getElementById("res");
res.value =a*b;
}
中找到了这个