代码之家  ›  专栏  ›  技术社区  ›  Maxime Laflamme

如何调试JWT承载错误“invalid_token”

  •  0
  • Maxime Laflamme  · 技术社区  · 8 年前

    我正在尝试使用jwt保护现有的AspNet Core 2.0/angular 4应用程序。我在客户端使用angular2 jwt,效果很好。然而,当涉及到我的WebApi时,我的令牌总是被拒绝(使用angular2 jwt的AuthHttp来启动我的请求,甚至使用postman)。我得到的唯一响应是401 Bearer error=“invalid_token”。我已经和jwt核实过了。io chrome扩展,看起来很好(签名、观众、发行人)。我在IIS日志中也找不到它被视为无效的原因。所以我的问题是,我如何才能获得更多关于代币问题的信息? 任何帮助都将不胜感激。

    这是我的创业公司,仅供参考。反恐精英

    public class Startup
      {
    
    public static void Main(string[] args)
    {
      var host = new WebHostBuilder()
          .UseKestrel()
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseIISIntegration()
          .UseStartup<Startup>()
          .Build();
    
      host.Run();
    }
    public Startup(IHostingEnvironment env)
    {
      var builder = new ConfigurationBuilder()
          .SetBasePath(env.ContentRootPath)
          .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
          .AddEnvironmentVariables();
      Configuration = builder.Build();
    }
    
    public IConfigurationRoot Configuration { get; }
    
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
    
      IConfigurationSection jwtConf = this.Configuration.GetSection("jwt");
    
      services.Configure<Controls.JWTConf>(Configuration.GetSection("jwt"));
    
    
      services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
         .AddJwtBearer(options =>
         {
           options.TokenValidationParameters =
                           new TokenValidationParameters
                           {
                             ValidateIssuer = true,
                             ValidateAudience = true,
                             ValidateLifetime = true,
                             ValidateIssuerSigningKey = true,
                             ValidIssuer = jwtConf.GetValue<string>("issuer"),
                             ValidAudience = jwtConf.GetValue<string>("audience"),
                             IssuerSigningKey = Security.JwtSecurityKey.Create(jwtConf.GetValue<string>("keyBase"))
                           };
         });
    
    
    
      services.AddMvc(
              config =>
              {
                var policy = new AuthorizationPolicyBuilder()
                                 .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                                 .RequireClaim(ClaimTypes.Name)
                                 .Build();
                config.Filters.Add(new AuthorizeFilter(policy));
              }
        ).AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
    
      services.AddNodeServices();
    
      string conn = this.Configuration.GetConnectionString("optimumDB");
    
      services.AddDbContext<TracDbContext>(options =>
          options.UseSqlServer(conn));
    
      // Register the Swagger generator, defining one or more Swagger documents
      services.AddSwaggerGen(c =>
      {
        c.SwaggerDoc("v1", new Info { Title = "Angular 4.0 Universal & ASP.NET Core advanced starter-kit web API", Version = "v1" });
      });
    }
    
    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, TracDbContext context)
    {
      loggerFactory.AddConsole(Configuration.GetSection("Logging"));
      loggerFactory.AddDebug();
    
      app.UseStaticFiles();
    
    
      app.UseAuthentication();
    
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
        app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
        {
          HotModuleReplacement = true,
          HotModuleReplacementEndpoint = "/dist/__webpack_hmr"
        });
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
          c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        });
    
        // Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint.
    
    
        app.MapWhen(x => !x.Request.Path.Value.StartsWith("/swagger", StringComparison.OrdinalIgnoreCase), builder =>
        {
          builder.UseMvc(routes =>
          {
            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
          });
        });
      }
      else
      {
        app.UseMvc(routes =>
        {
          routes.MapRoute(
           name: "default",
           template: "{controller=Home}/{action=Index}/{id?}");
    
          routes.MapRoute(
           "Sitemap",
           "sitemap.xml",
           new { controller = "Home", action = "SitemapXml" });
    
          routes.MapSpaFallbackRoute(
            name: "spa-fallback",
            defaults: new { controller = "Home", action = "Index" });
    
        });
        app.UseExceptionHandler("/Home/Error");
    
      }
    }
    
      }
    

    我的令牌生成控制器

      [Route("api/token")]
      [AllowAnonymous]
      public class TokenController : Controller
      {
    
    private IOptions<JWTConf> jwt;
    
    public TokenController(IOptions<JWTConf> jwtConf)
    {
      this.jwt = jwtConf;
    }
    
    [HttpPost]
    public IActionResult Create([FromBody]string userCode)
    {
      Model.Entities.Utilisateur user = new Model.Entities.Utilisateur { ID_UTILISATEUR = 6 };
    
      JwtToken token = new JwtTokenBuilder()
                          .AddSecurityKey(JwtSecurityKey.Create(this.jwt.Value.keyBase))
                          .AddSubject("User")
                          .AddIssuer(this.jwt.Value.issuer)
                          .AddAudience(this.jwt.Value.audience)
                          .AddClaim(ClaimTypes.Name,user.ID_UTILISATEUR.ToString())
                          .AddExpiry(1440)
                          .Build();
    
      var tok = new { token = token.Value };
    
      //return Ok(token);
      return Ok(JsonConvert.SerializeObject(tok));
    }
      }
    

      [Produces("application/json")]
      public class JobsController : BaseController
      {
    public JobsController(IConfiguration config, TracDbContext db) : base(config, db)
    {
    
    }
    
    // GET: api/Jobs
    [HttpGet]
    [Route("api/Jobs")]
    public IEnumerable<Departement> Get()
    {
      return new GroupedJobs(Db.GetJobs().ToList());
    }
    
    [HttpGet]
    [Route("api/Jobs/{id}")]
    public JOB_CLIENT Get(int id)
    {
      return Db.GetDetailsJob(id);
    }
    
     }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Maxime Laflamme    8 年前

    发现问题。。。原来我是用引号把令牌存储起来的。因此,正在发送的授权标头如下所示

    持有人“令牌”

    而不是

    不记名代币

    作为一个新手,我认为引用是由AuthHtpp添加的,并且是协议的一部分。