如何使用 JWT 授权 SignalR Core Hub 方法
How to authorize SignalR Core Hub method with JWT
我在带有 OpenIddict 的 ASP.NET Core 2.0 应用程序中使用 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)
{
}
}
我强烈建议您继续在握手级别进行身份验证,而不是使用您在 SignalR 级别实施的自定义和非标准解决方案。
假设您正在使用验证处理程序,您可以强制它从查询字符串中检索访问令牌:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddOAuthValidation(options =>
{
options.Events.OnRetrieveToken = context =>
{
context.Token = context.Request.Query["access_token"];
return Task.CompletedTask;
};
});
}
或OnMessageReceived
如果你想使用JWTBearer
:
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;
},
};
});
不需要其他更改。
我在带有 OpenIddict 的 ASP.NET Core 2.0 应用程序中使用 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)
{
}
}
我强烈建议您继续在握手级别进行身份验证,而不是使用您在 SignalR 级别实施的自定义和非标准解决方案。
假设您正在使用验证处理程序,您可以强制它从查询字符串中检索访问令牌:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddOAuthValidation(options =>
{
options.Events.OnRetrieveToken = context =>
{
context.Token = context.Request.Query["access_token"];
return Task.CompletedTask;
};
});
}
或OnMessageReceived
如果你想使用JWTBearer
:
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;
},
};
});
不需要其他更改。