Blazor认证库为何发送Payload为空的Access Token JWT?
使用Microsoft.AspNetCore.Components.WebAssembly.Authentication (6.0.15),以Auth0作为身份提供商(IdP),在Blazor WASM端按标准步骤配置后出现token无效问题:
配置代码(Program.cs)
... builder.Services.AddHttpClient( "SecureAPIClient", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) ).AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>(); ... builder.Services.AddOidcAuthentication(options => { builder.Configuration.Bind("Auth0", options.ProviderOptions); options.ProviderOptions.ResponseType = "code"; options.ProviderOptions.DefaultScopes.Add("openid"); options.ProviderOptions.DefaultScopes.Add("profile"); options.ProviderOptions.DefaultScopes.Add("email"); }); ...
组件请求代码
组件的OnInitialized方法中(原代码拼写OnInilialized为笔误):
... HttpClient http = _httpClientFactory.CreateClient("SecureAPIClient"); var response = await http.GetFromJsonAsync<POSTS>(getPostsUrl); ...
错误现象
- Kestrel服务器返回响应:
www-authenticate Bearer error="invalid_token" - 排查发现请求中的access token格式为
header..secret,Payload为空,验证JWT时提示:Warning: Looks like your JWT payload is not a valid JSON object. JWT payloads must be top level JSON object as per https://tools.ietf.org/html/rfc7519#section-7.2
未指定API Audience:Auth0默认返回的access token是针对自身管理API的,若要获取针对你的自定义API的有效JWT,必须在OIDC配置中指定
Audience参数。当前配置未设置options.ProviderOptions.Audience,导致Auth0返回的token不符合你的API要求,出现Payload为空的异常格式。Scope配置存在缺失:虽然添加了OIDC标准范围,但如果你的API需要特定权限范围,未添加会导致token生成异常。另外需确保
openid是第一个添加的范围,OIDC认证流程依赖该范围正确生成ID Token和Access Token。Auth0应用类型配置错误:需在Auth0控制台确认应用类型为“Single Page Application”,Blazor WASM属于此类应用,错误的应用类型会导致token格式异常。同时检查“Allowed Callback URLs”“Allowed Logout URLs”等地址是否与Blazor应用地址完全匹配,配置不匹配会导致认证流程不完整,获取到无效token。
请求地址超出Handler匹配范围:
BaseAddressAuthorizationMessageHandler仅会为BaseAddress范围内的请求添加token。如果getPostsUrl指向的地址不在builder.HostEnvironment.BaseAddress范围内,Handler可能不会正确添加有效token,甚至误添加无效的token(比如ID Token而非Access Token)。
内容的提问来源于stack exchange,提问作者acmoune

