【问题标题】:How to authorize SignalR Core Hub method with JWT如何使用 JWT 授权 SignalR Core Hub 方法
【发布时间】:2018-03-27 16:56:03
【问题描述】:

我在我的 ASP.NET Core 2.0 应用程序中通过 OpenIddict 使用 JWT 身份验证。

我在 this thread 中遵循想法,并在 SignalR 握手后调用 AuthorizeWithJWT 方法。但是现在,我不知道应该在AuthorizeWithJWT 方法中设置什么,所以我可以使用[Authorize(Roles="Admin")] 为例。

我尝试设置上下文用户,但它是只读的:

public class BaseHub : Hub
{    
    public async Task AuthorizeWithJWT(string AccessToken)
    {
        //get user claims from AccesToken
        this.Context.User = user;  //error User is read only
    }
}

并使用授权属性:

public class VarDesignImportHub : BaseHub
{
    [Authorize(Roles = "Admin")]
    public async Task Import(string ConnectionString)
    {
    }
}

【问题讨论】:

    标签: authentication signalr openiddict asp.net-core-signalr


    【解决方案1】:

    我强烈建议您继续在握手级别进行身份验证,而不是使用您在 SignalR 级别实施的自定义和非标准解决方案。

    假设您正在使用验证处理程序,您可以强制它从查询字符串中检索访问令牌:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication()
            .AddOAuthValidation(options =>
            {
                options.Events.OnRetrieveToken = context =>
                {
                    context.Token = context.Request.Query["access_token"];
    
                    return Task.CompletedTask;
                };
            });
    }
    

    如果你想使用JWTBearer,或者OnMessageReceived

    services.AddAuthentication()
        .AddJwtBearer(o =>
        {
            o.Events = new JwtBearerEvents()
            {
                OnMessageReceived = context =>
                {
                    if (context.Request.Path.ToString().StartsWith("/HUB/"))
                        context.Token = context.Request.Query["access_token"];
                    return Task.CompletedTask;
                },
            };
        });
    

    不需要进行其他更改。

    【讨论】:

    • 是的,这将是一个有效的案例,但正如 github 线程(link1link2)中所解释的那样,这种方法存在一些安全风险。因为查询中的 access_token 是公开的(您可以记录它...)。如果没有其他方法可行,会这样做。
    • 但是一次性访问令牌可以做到吗? @Pinpoint 你怎么看?
    • 唯一的“风险”是访问令牌将包含在日志中(这在 OAuth2 承载规范中有明确说明)。为避免这种情况,您可以使用过滤 API 禁用包括查询字符串在内的日志记录跟踪。
    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 2018-04-04
    • 2020-06-18
    • 2019-06-24
    • 1970-01-01
    • 2021-10-05
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多