Blazor Server(.NET 8)中Microsoft Identity认证HubConnection遇403问题
问题解决:Blazor Server SignalR HubConnection 403 Forbidden 及 AccessToken 获取方法
1. 获取 AccessToken 的正确方式
在 Blazor Server 组件中,通过注入 ITokenAcquisition 服务获取用户访问令牌,替换空白的 AccessTokenProvider 逻辑:
首先在组件顶部注入服务:
@inject ITokenAcquisition TokenAcquisition
修改 OnInitializedAsync 中的配置:
protected override async Task OnInitializedAsync() { hubConnection = new HubConnectionBuilder() .WithUrl(NavigationManager.ToAbsoluteUri("/chatservice"), options => { options.AccessTokenProvider = async () => { // 替换为你的应用API范围,格式:api://{Azure AD应用ID}/自定义范围名称 var scope = "api://your-azure-ad-app-id/access_as_user"; return await TokenAcquisition.GetAccessTokenForUserAsync(new[] { scope }); }; }) .Build(); hubConnection.On<string, string>("ReceiveMessage", (user, message) => { userMessages.Add(new UserMessage { Username = user, Message = message, isCurrentUser = user == usernameInput, DateSent = DateTime.Now }); this.InvokeAsync(() => this.StateHasChanged()); }); await hubConnection.StartAsync(); }
2. 后端 Hub 配置授权
给 ChatService Hub 添加 [Authorize] 属性,限制仅授权用户可连接:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; [Authorize] public class ChatService : Hub { // 你的Hub业务逻辑 }
3. Azure AD 应用注册调整
- 添加自定义 API 范围:
- 进入 Azure AD 应用注册页面,找到你的应用,切换到「公开 API」选项卡
- 添加自定义范围(如
access_as_user),设置受众为「已授权的客户端应用」并勾选当前应用
- 更新回复 URL:
在「身份验证」选项卡中,添加 Azure App Service 完整回调 URL,格式:https://your-app-service-name.azurewebsites.net/signin-oidc - 配置 App Service 身份验证:
在 Azure 门户的 App Service 「身份验证」选项中,启用「Microsoft 身份验证提供者」,关联你的 Azure AD 应用,并将「未认证请求」设置为「重定向到登录页」
4. 优化 Program.cs 配置
补充 AddMicrosoftIdentityWebApi 以完善 API 授权支持,确保认证中间件顺序正确:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
本地与部署差异说明
本地运行时依赖 localhost 回调 URL,Azure AD 默认允许本地测试;部署到 App Service 后,必须保证应用注册的回复 URL、API 范围、App Service 身份验证配置完全匹配,否则会触发 403 禁止访问错误。
内容的提问来源于stack exchange,提问作者bbWebDev
相关产品推荐
相关产品推荐

