在授权Web套接字之前附加授权标头

时间:2019-02-20 00:35:36

标签: c# websocket .net-core signalr

我正在重构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函数,为什么会发生这种情况?

1 个答案:

答案 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;
}

我在Signalr Authentication Docs

中找到了这个