Vue.js+ASP.NET Core中JWT获取当前用户信息遇未授权问题
解决JWT获取当前用户信息时的未授权问题
以下是针对你遇到的未授权问题的具体修复步骤:
1. 恢复并配置[Authorize]特性与声明映射
你的GetCurrentUser方法注释掉了[Authorize],首先要恢复该特性,同时需要配置JWT声明与.NET标准Claim类型的映射,否则无法从User.Claims中正确获取邮箱和用户名:
修改Program.cs中的JWT配置部分:
.AddJwtBearer(x => { x.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = config["JwtSettings:Issuer"], ValidAudience = config["JwtSettings:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["JwtSettings:Key"])), ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true }; // 添加声明映射,将JWT标准声明映射到ClaimTypes x.ClaimActions.MapJsonKey(ClaimTypes.Email, JwtRegisteredClaimNames.Email); x.ClaimActions.MapJsonKey(ClaimTypes.Name, JwtRegisteredClaimNames.Sub); });
同时恢复GetCurrentUser上的[Authorize]:
[HttpGet("Info")] [Authorize] public ActionResult<UserAccount> GetCurrentUser() { // 方法内容保留 }
2. 修正JWT生成时的Audience参数
在SignIn接口生成JWT时,Audience错误地使用了Issuer值,导致与验证配置不匹配,修改如下:
var token = new JwtSecurityToken( issuer: configuration["JwtSettings:Issuer"], audience: configuration["JwtSettings:Audience"], // 替换为配置中的Audience claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds);
3. 移除UserAccount类中的冗余Password属性
UserAccount继承自IdentityUser,该类已通过PasswordHash管理密码,自定义的Password属性会干扰Identity的密码处理逻辑,直接删除:
public class UserAccount : IdentityUser { // 删除此行:public string Password { get; set; } = string.Empty; public string UserType { get; set; } = string.Empty; public string JHFullName { get; set; } = string.Empty; // 其他属性保留 }
4. 优化Vue端的Token传递方式
路由参数传递Token可能存在截断或安全问题,建议改用localStorage存储Token:
// 登录成功后存储Token // 示例:登录接口的then回调中 localStorage.setItem("jwtToken", response.data.token); // 在UserSettingsView中获取Token const token = localStorage.getItem("jwtToken");
同时打印Authorization头确认格式正确:
console.log("Authorization Header:", `Bearer ${token}`);
5. 验证JWT配置的一致性
确保appsettings.json中的JwtSettings配置项完整且前后端一致:
"JwtSettings": { "Issuer": "YourIssuerName", "Audience": "YourAudienceName", "Key": "YourSecretKeyMustBeAtLeast16CharactersLong" }
内容的提问来源于stack exchange,提问作者haknook
相关产品推荐
相关产品推荐

