.NET 8.0下实现Blazor WASM第三方认证并验证后端请求的最简方案
问题:Blazor WebAssembly(.NET 8)结合Google第三方认证实现后端API请求验证
背景与初始尝试
我正在用.NET 8开发Blazor WebAssembly站点,需求是通过Google等第三方认证实现用户登录,同时要验证WASM前端向自有后端发起的API请求。不需要用户名密码认证,也不想用ASP.NET Identity把用户账户存到SQL数据库。
微软相关文档逻辑混乱,既有关于认证库使用的指南,也有通过VS模板创建Blazor Web App后指向的第三方认证文档,二者指引完全不同。.NET 8的Blazor Web App模板也让人困惑,选了WebAssembly模式后,生成的解决方案包含服务器端ASP.NET项目和WASM项目,原以为是纯WASM项目,实际是带交互式WASM渲染模式的Blazor Server项目,这让我搞不清方向。
后来调整后让Google认证部分可用,服务器端Program.cs的关键配置如下:
builder.Services.AddAuthentication() .AddGoogle(options => { IConfigurationSection googleAuthNSection = builder.Configuration.GetSection("Authentication:Google"); options.ClientId = googleAuthNSection["ClientId"]; options.ClientSecret = googleAuthNSection["ClientSecret"]; });
能正常跳转到Google认证页面完成登录,也能读取令牌声明,但认证信息只在WASM端可用,后端处理API请求时HttpContext拿不到该信息,而且WASM端获取不到实际令牌,没法把签名令牌传给后端做可靠认证——这是必须实现的功能。
我可以放弃现有原型,从新模板开始,想知道:实现Blazor WASM应用+第三方认证(如Google)+后端请求验证的最简方式是什么?考虑过的方案:
- 独立Blazor WASM应用,获取JWT令牌后传给后端,由后端验证
- .NET 8带渲染模式的Blazor应用,登录页服务器端渲染,主体WASM端,服务器端注册认证实现交互——但不确定这条路是否可行
- 其他方案
更新1:独立WASM模板的问题
用独立Blazor WebAssembly模板重新开始,按认证库指南配置后,认证仍有问题:
- 无法在
options.ProviderOptions.DefaultScopes.Add("{SCOPE URI}");中配置自定义作用域,一添加就提示「invalid scope」错误,似乎只允许用Google API的URI作为作用域,没法给自有应用定义作用域 - 拿不到可用于API请求的访问令牌,推测和没定义自定义作用域有关
- 认证库似乎只支持
request_type为「id_token」的情况,改成「token」后,浏览器能看到Google返回了JWT令牌,但认证库无法处理,登录流程直接卡住
更新2:关键发现
折腾几天后的几点发现:
- 用
response_type为「id_token token」时,Google返回的「访问令牌」是无效的签名JWT令牌,格式错误,没法通过任何JWT验证,搞不懂Google为什么返回这种东西 - 找到一种方法:在Google回调返回Blazor应用时,从URL里手动提取有效的id令牌——离谱的是居然没有API能获取这个令牌,但手动提取后,把它放到后端请求里,后端能轻松验证
- 吐槽Google返回无效令牌,吐槽微软API设计和误导性文档
等整理好后会把解决方案做成项目模板,感兴趣可以告知。
核心需求
- 实现客户端Google登录
- 获取JWT令牌
- 能查看JWT令牌中的声明(姓名、用户ID)
- 向后端API请求时携带JWT作为Bearer令牌
- 后端能合理验证JWT并查看声明
内容的提问来源于stack exchange,提问作者Vesa Vainio
相关产品推荐
相关产品推荐

