C# Blazor WASM:确保视频流控制器的安全,仅授权用户可以访问

C# Blazor WASM:确保视频流控制器的安全,仅授权用户可以访问,c#,asp.net-core,blazor,blazor-webassembly,C#,Asp.net Core,Blazor,Blazor Webassembly,信息:我正在使用默认的Visual Studio(16.10.0预览版1.0)ASP.NET托管的Blazor WASM模板和IdentityServer 4个人帐户。(ASP.NET Core 6预览版1) 我希望视频流只能由授权用户访问,但是[Authorize]属性在控制器上不起作用,我得到一个状态代码:401,而用户已登录,因此已被应用程序授权[Authorize]与控制器一起使用,例如用于数据库访问 我认为它可能不适用于视频标记,因为客户端直接从视频标记选项访问控制器:您的问题是授权头

信息:我正在使用默认的Visual Studio(16.10.0预览版1.0)ASP.NET托管的Blazor WASM模板和IdentityServer 4个人帐户。(ASP.NET Core 6预览版1)

我希望视频流只能由授权用户访问,但是
[Authorize]
属性在控制器上不起作用,我得到一个
状态代码:401
,而用户已登录,因此已被应用程序授权<代码>[Authorize]与控制器一起使用,例如用于数据库访问


我认为它可能不适用于
视频
标记,因为客户端直接从
视频
标记选项访问控制器:
您的问题是
授权
头没有随请求一起发送。正如您自己所说,它没有使用传统的
HttpClient
并通过浏览器加载,但问题是它应该让
[Authroize]
按预期工作

这意味着您需要将WASM代码转换为以字节流形式读取
.mp4
,然后使用
IJSRuntime
将其发送到浏览器,并使用JavaScript构建视频,但这是一种非常笨拙和糟糕的体验


更好的选择是使用
HttpClient
请求视频URL,至少这样你知道客户端有权知道
mp4
的文件路径是什么。

我真的不明白为什么有些人认为这个问题没有用或缺乏研究。不清楚吗?没有任何评论,我不知道该怎么办。昨天这让我质疑自己,感觉不太好。但好吧,这是这个平台的一个特点,但我不知道它为什么会存在,不必留下评论。Jaap,我个人认为你的问题看起来不错。我认为您的问题与Blazor无关,而是如何授权API调用。我建议Google做一些类似“如何在c#中授权web api请求”的事情。你会看到很多例子,也许可以为你指出正确的方向。杰森,谢谢你的评论。我在谷歌上搜索了一个解决方案。我认为这里的问题是,
[Authorize]
属性在直接从
标记访问的控制器上不起作用。这不是一个
HttpClient
请求。我看了这里:,这里:,这里:,还有这里:。这里@JasonD还没有,但我想问一下是的,问题在于将
标记与JWT结合使用。我也在考虑添加临时请求头并结合某种cookie授权,但我的代码仍然没有按应有的方式工作,例如“安全”。
<video id="videostream" poster="@videoPoster" class="videostyle" oncontextmenu="return false;" controls disablePictureInPicture controlsList="nodownload">
    <source src="/VideoStream/@videoFileName" type="@ContentType;codecs=@Codecs" />
    Your browser does not support the video tag.naar een nieuwere versie.
</video>
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;
using System.IO;

namespace Mediatheek.Server.Controllers
{
    //[ApiController] 
    [Route("[controller]")]
    public class VideoStreamController : ControllerBase
    {
        private readonly IWebHostEnvironment env;
        private readonly ILogger<VideoStreamController> logger;
        public VideoStreamController(ILogger<VideoStreamController> logger, IWebHostEnvironment env)
        {
            this.logger = logger;
            this.env = env;
        }

        //[Authorize] // Doesn't work here, even when [ApiController] is uncommented
        [HttpGet("{file}")]
        public IActionResult StreamVideo(string file)
        {
            var provider = new PhysicalFileProvider(env.ContentRootPath);
            var videoPathFile = Path.Combine(provider.Root, "Files", "Videos", $"{file}.mp4");
            var fileResponse = PhysicalFile(videoPathFile, "application/octet-stream");
            fileResponse.EnableRangeProcessing = true;
            fileResponse.FileDownloadName = "video.mp4"; // rename original filename, just for testing
            return fileResponse;
        }
    }
}