diff --git a/server/Program.cs b/server/Program.cs index b3c015e..c5fbe28 100644 --- a/server/Program.cs +++ b/server/Program.cs @@ -64,6 +64,37 @@ try }; options.Authority = $"http://{Global.LocalHost}:5000"; options.RequireHttpsMetadata = false; + + // We have to hook the OnMessageReceived event in order to + // allow the JWT authentication handler to read the access + // token from the query string when a WebSocket or + // Server-Sent Events request comes in. + + // Sending the access token in the query string is required when using WebSockets or ServerSentEvents + // due to a limitation in Browser APIs. We restrict it to only calls to the + // SignalR hub in this code. + // See https://docs.microsoft.com/aspnet/core/signalr/security#access-token-logging + // for more information about security considerations when using + // the query string to transmit the access token. + options.Events = new JwtBearerEvents + { + OnMessageReceived = context => + { + var accessToken = context.Request.Query["access_token"]; + + // If the request is for our hub... + var path = context.HttpContext.Request.Path; + if (!string.IsNullOrEmpty(accessToken) && ( + path.StartsWithSegments("/hubs/JtagHub") || + path.StartsWithSegments("/hubs/ProgressHub") + )) + { + // Read the token out of the query string + context.Token = accessToken; + } + return Task.CompletedTask; + } + }; }); // Add JWT Token Authorization Policy builder.Services.AddAuthorization(options => diff --git a/server/src/Controllers/VideoStreamController.cs b/server/src/Controllers/VideoStreamController.cs index 0c23365..33820ae 100644 --- a/server/src/Controllers/VideoStreamController.cs +++ b/server/src/Controllers/VideoStreamController.cs @@ -11,6 +11,7 @@ using server.Services; /// [ApiController] [Authorize] +[EnableCors("Users")] [Route("api/[controller]")] public class VideoStreamController : ControllerBase { @@ -64,7 +65,6 @@ public class VideoStreamController : ControllerBase /// /// 服务状态信息 [HttpGet("ServiceStatus")] - [EnableCors("Users")] [ProducesResponseType(typeof(VideoStreamServiceStatus), StatusCodes.Status200OK)] [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public IResult GetServiceStatus() @@ -85,7 +85,6 @@ public class VideoStreamController : ControllerBase } [HttpGet("MyEndpoint")] - [EnableCors("Users")] [ProducesResponseType(typeof(VideoStreamEndpoint), StatusCodes.Status200OK)] [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public IResult MyEndpoint() @@ -109,7 +108,6 @@ public class VideoStreamController : ControllerBase /// /// 连接测试结果 [HttpPost("TestConnection")] - [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public async Task TestConnection() @@ -143,6 +141,8 @@ public class VideoStreamController : ControllerBase } [HttpPost("SetVideoStreamEnable")] + [ProducesResponseType(typeof(object), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] public async Task SetVideoStreamEnable(bool enable) { try