Authentication 如何使用JWT授权信令核心集线器方法

Authentication 如何使用JWT授权信令核心集线器方法,authentication,signalr,openiddict,asp.net-core-signalr,Authentication,Signalr,Openiddict,Asp.net Core Signalr,我正在使用OpenIddict的ASP.NET Core 2.0应用程序中使用JWT身份验证 在信号员握手后,我按照想法调用了JWT方法的AuthorizeWithJWTmethod。但是现在,我不知道应该在AuthorizeWithJWT方法中设置什么,以便可以使用[Authorize(Roles=“Admin”)]作为示例 我尝试设置上下文用户,但它是只读的: public class BaseHub : Hub { public async Task AuthorizeWi

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

在信号员握手后,我按照想法调用了JWT方法的
AuthorizeWithJWT
method。但是现在,我不知道应该在
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
    }
}
并使用authorize属性:

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

我强烈建议您继续在握手级别进行身份验证,而不是使用在信号器级别实现的定制和非标准解决方案

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

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线程(,)中所解释的,这种方法存在一些安全风险。因为查询中的访问令牌是公共的(您可以将其记录…)。如果没有其他的方法可以的话,我会这么做。但一次性访问令牌可以做到吗@请指出您的想法?唯一的“风险”是访问令牌将包含在日志中(OAuth2承载规范中对此进行了明确解释)。为了避免这种情况,可以使用过滤API禁用日志记录跟踪,包括查询字符串。