Azure AD B2C本地运行正常 部署Azure后报401未授权错误
Blazor应用部署到Azure后Azure AD B2C认证返回401未授权问题
问题现象
本地运行调用.NET Web API、采用Azure AD B2C实现身份认证的Blazor应用时功能完全正常:可通过登录页面完成身份认证,接口调用全部正常。部署到Azure托管后,浏览器端出现如下报错:
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user
Failed to load resource: the server responded with a status of 401 (Unauthorized)
现有配置
Blazor UI侧配置
"AzureAd": { "Authority": "https://CarehomeRoomBookingTest.b2clogin.com/CarehomeRoomBookingTest.onmicrosoft.com/B2C_1_SignUpIn", "ClientId": "77##############################", "ClientSecret": "99#########################", "ValidateAuthority": false }
Web API侧配置
"AzureAdB2C": { "Instance": "https://CarehomeRoomBookingTest.b2clogin.com", "ClientId": "16#############################", "Domain": "CarehomeRoomBookingTest.onmicrosoft.com", "SignedOutCallbackPath": "/signout/B2C_1_susi_reset_v2", "SignUpSignInPolicyId": "B2C_1_SignUpIn", "TenantId": "38#############################" }
核心原因与排查方向
- 首要排查Azure AD B2C应用注册的重定向URI配置:本地调试时通常仅添加了
localhost开头的回调地址,若未同步添加部署后Azure站点的正式域名回调地址,B2C会拒绝向未登记的地址返回认证令牌,最终登录流程拿不到有效用户身份,所有需要鉴权的请求都会以匿名身份发起,触发DenyAnonymousAuthorizationRequirement校验失败返回401。 - 核对Azure应用服务的配置项:Azure应用服务的应用设置优先级高于本地发布的
appsettings.json文件,若未在应用服务配置页正确填写AzureAd、AzureAdB2C节点下的ClientId、ClientSecret、Authority等全量参数,应用启动后会读取到空配置值,认证中间件无法正常完成令牌校验流程。 - 检查数据保护配置(Blazor Server场景):Blazor Server的认证cookie依赖数据保护密钥加解密,本地运行时密钥默认存在本地用户目录,部署到Azure后如果没有显式配置持久化的数据保护密钥存储,多实例部署或者应用重启后会出现密钥不匹配,无法解密已有认证cookie,导致已登录用户的身份识别失败。
- 补全API侧的令牌校验配置:当前贴出的Web API配置缺少Audience相关配置项,本地运行时可能默认关闭了受众校验,部署后认证中间件默认会校验令牌的
aud声明,若传入令牌的aud值与API的ClientId不匹配,会直接判定令牌无效返回401。 - 检查跨域与HTTPS配置:若为Blazor WASM托管模式,需确认部署后API的CORS策略允许Blazor正式域名跨域访问,否则令牌无法正常附加到请求头;同时确认站点HTTPS配置正确,若存在HTTP到HTTPS跳转异常、Azure前端HTTPS终止配置错误,会导致回调地址协议不匹配,认证流程被拦截。
内容的提问来源于stack exchange,提问作者Matthew Watts
相关产品推荐
相关产品推荐

