我来详细描述一下问题: 最近在自学用vue-element-admin和.net core写一个前后端分离的程序。目前的问题出在:登录成功后,后台会返回一个Token给前端,前端在登录后需要利用Token再次请求后端获取用户信息。问题就出在这里:我虽然在request拦截器中加入了Token,但是后台无法获取到我发送的Token,度娘了很多办法都不行,下面是vue前端代码:
1.首先是请求数据的部分 export function getInfo(token) { return request({ baseURL:"http://localhost:28646/api", url: '/login/getInfo', method: 'get', params: { token } }) } 2.然后是前端request拦截器部分: service.interceptors.request.use( config => { if (store.getters.token) { //以下这几种办法试了都不行 //config.headers['Authorization'] = 'Bearer ' + getToken() //config.headers.authorization = 'Bearer ' + getToken() //config.headers.Authorization = 'Bearer ' + getToken() //axios.defaults.headers.common['Authorization'] = 'Bearer '+getToken(); config.headers = { 'Content-Type': 'application/json', 'Authorization':'Bearer asdfasd' } } return config }, error => { // 处理请求错误 console.log(error) return Promise.reject(error) } ) 【下面是.net core后台主要代码,使用JwtBearer工具校验】 1.首先是有关JWT校验的主要部分,也是从网上copy来的,通过Postman测试没问题 public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.Configure(Configuration.GetSection("tokenConfig")); //获取读取JWT的配置信息 var token = Configuration.GetSection("tokenConfig").Get(); var conStr = Configuration.GetSection("ConStr"); WebUtilty.SqlHelper.Constr = conStr.Value; //JWT身份认证 services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII. GetBytes(token.Secret)), ValidIssuer = token.Issuer, ValidAudience = token.Audience, ValidateIssuer = false, ValidateAudience = false, }; //【【【问题出在此处 此处为权限验证失败后触发的事件,使用Vue发送Toekn每次都会进来】】】 x.Events = new JwtBearerEvents { OnChallenge = context => { context.HandleResponse(); var payload = JsonConvert.SerializeObject(new { msg = "授权未通过,Token无效", data = DBNull.Value, code = 401 }); //自定义返回的数据类型 context.Response.ContentType = "application/json"; //自定义返回状态码,默认为401 我这里改成 200 context.Response.StatusCode = StatusCodes.Status200OK; context.Response.WriteAsync(payload); return Task.FromResult(0); } }; }); //配置跨域(注:已在 public void Configure方法中使用跨域:app.UseCors();) services.AddCors(o => o.AddPolicy("any", p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); services.AddControllers(); //添加作用域 services.AddScoped<IAuthenticateService, TokenAuthenticationService>(); services.AddScoped<IUserService, UserService>(); } 2.然后是后台API接口 (注:加上[Authorize]就无法进入方法,注释掉就能进入并且通过 “Request.Headers["Authorization"].ToString()”可以获取到vue发送的Token)
///
以上就是主要代码了,有个很奇怪的地方就是我用相同的Token,用Postman发送完全没有问题,但是用自己做的vue发送就会一直进入( x.Events = new JwtBearerEvents)事件导致失败,
以上问题自己搞了好几天了,实在没有头绪了,不知道有没有大佬能提供宝贵意见
你抓包看请求呗,是不是丢数据了
不好意思,问题提交后代码全乱了,我来发点图片
问题解决了,是跨域问题。没想到这个是因为后台已经添加了跨域的设置,没想到前台还需要再设置一次。应该是添加的[Authorize] 导致跨域,具体解决方法:https://www.cnblogs.com/xing-29391/p/14726318.html