簡體   English   中英

WebAPI ASP Net Core JWT承載身份驗證“簽名無效”

[英]WebAPI ASP Net Core JWT Bearer Authentication “The signature is invalid”

我一直在嘗試使用JWT承載身份驗證來開發簡單的Web API。 到目前為止,我已經有一個完全開發的應用程序,現在我需要一個Web API來提供與其他技術的通信。

首先,我在這里找到了提供簡單示例的本教程: https : //medium.com/@renato.groffe/asp-net-core-2-0-autentica%C3%A7%C3%A3o-em-的API-utilizando,智威湯遜- JSON-Web的令牌,4b1871efd

可以在這里找到代碼: https : //github.com/renatogroffe/ASPNETCore2_JWT/tree/master/APIAlturas

我能夠測試該項目,它可以與JWT承載身份驗證一起正常工作。

當我不得不在控制器中進行一些依賴注入以從存儲庫中檢索數據時,問題就開始了。 我的API無法解決我的依賴關系,因此我必須在Startup.cs文件中進行一些更改。

因此,與上面的示例相比,現在我的項目中唯一不同的是Startup.cs文件。

這里發生的是我的API生成了一個令牌,當我嘗試將其發送到我的另一個控制器(在標頭中)時,它返回: “ Bearer error =” invalid_token“,error_description =”簽名無效“

我的猜測是我的Startup.cs文件中的某些內容使我的身份驗證混亂。

我注意到這是另一件事,我在appsettings.json文件中設置了令牌配置。 當我調用生成令牌的方法時,這些參數未在我的tokenConfigurations對象中設置。 但是,調試代碼后,我的startup.cs文件接收了參數。 當我調用控制器時,這些參數現在在此對象中為null。

    public object Post([FromBody]User usuario,[FromServices]SigningConfigurations signingConfigurations, [FromServices]TokenConfigurations tokenConfigurations){     ... my code        

}

這是我的startup.cs文件

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Stratec.WebAPI;
using Stratec.Configuration;
using Stratec.Domain;
using Autofac;
using Hangfire;
using Microsoft.AspNetCore.Http;
using Stratec.Web;
using Hangfire.SqlServer;

namespace Stratec.WebAPI
{
    public class Startup
    {
        public IConfiguration Configuration { get; }

        public Startup(IHostingEnvironment env)
        {
            Configuration = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                // .AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true)
                //.AddXmlFile($"appsettings.{env.EnvironmentName}.xml", optional: true)
                .AddEnvironmentVariables()
                .Build();

            Configuracao.Configuration = Configuration;
        }

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<UsersDAO>();

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

            var signingConfigurations = new SigningConfigurations();
            services.AddSingleton(signingConfigurations);

            var tokenConfigurations = new TokenConfigurations();
            new ConfigureFromConfigurationOptions<TokenConfigurations>(
                Configuration.GetSection("TokenConfigurations"))
                    .Configure(tokenConfigurations);
            services.AddSingleton(tokenConfigurations);

            services.AddAuthentication(authOptions =>
            {
                authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                authOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(bearerOptions =>
            {
                var paramsValidation = bearerOptions.TokenValidationParameters;
                paramsValidation.IssuerSigningKey = signingConfigurations.Key;
                paramsValidation.ValidAudience = tokenConfigurations.Audience;
                paramsValidation.ValidIssuer = tokenConfigurations.Issuer;

                // Valida a assinatura de um token recebido
                paramsValidation.ValidateIssuerSigningKey = true;

                // Verifica se um token recebido ainda é válido
                paramsValidation.ValidateLifetime = true;

                // Tempo de tolerância para a expiração de um token (utilizado
                // caso haja problemas de sincronismo de horário entre diferentes
                // computadores envolvidos no processo de comunicação)
                paramsValidation.ClockSkew = TimeSpan.Zero;
            });

            // Ativa o uso do token como forma de autorizar o acesso
            // a recursos deste projeto
            services.AddAuthorization(auth =>
            {
                auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                    .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                    .RequireAuthenticatedUser().Build());
            });

            services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("ConexaoPadrao")));
            JobStorage.Current = new SqlServerStorage(Configuration.GetConnectionString("ConexaoPadrao"));
            // services.AddMvcCore();
            services.AddMvc();

            var assemblies = new[]
            {
                typeof(Startup).Assembly,
                typeof(Colaborador).Assembly
            };

            //IContainer container = null;

            var serviceProvider = ConfigurationApplication.Inicialize(services, Configuration, assemblies);

            //GlobalConfiguration.Configuration.UseAutofacActivator(container);

            return serviceProvider;
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMiddleware<UnitOfWorkMiddleware>();
            app.UseMiddleware<AutenticacaoMiddleware<Autenticacao>>();

            app.UseMvc();            

            app.UseStaticFiles();
        }
    }
}

有人可以幫我嗎? 我一直在嘗試在這里的問題中找到一些東西,但是找不到類似的問題。

  1. 我剛剛在您上面提到教程中測試了代碼。 當我向登錄操作發布請求時:

     POST http://localhost:56435/api/login HTTP/1.1 Content-Type : application/json {userId:"usuario01",accessKey:"94be650011cf412ca906fc335f615cdc"} 

響應將是:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcc3RyZWFteHVcRG93bmxvYWRzXEFTUE5FVENvcmUyX0pXVC1tYXN0ZXJcQVNQTkVUQ29yZTJfSldULW1hc3RlclxBUElBbHR1cmFzXEFQSUFsdHVyYXNcYXBpXGxvZ2lu?=
X-Powered-By: ASP.NET
Date: Thu, 30 Aug 2018 01:12:10 GMT

{
  "authenticated": true,
  "created": "2018-08-30 09:12:10",
  "expiration": "2018-08-30 09:13:10",
  "accessToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6WyJ1c3VhcmlvMDEiLCJ1c3VhcmlvMDEiXSwianRpIjoiZTk0ZDU3NTMwZTczNDMzMTlkYjVlN2EwMDY2YjQwOTUiLCJuYmYiOjE1MzU1OTE1MzAsImV4cCI6MTUzNTU5MTU5MCwiaWF0IjoxNTM1NTkxNTMwLCJpc3MiOiJFeGVtcGxvSXNzdWVyIiwiYXVkIjoiRXhlbXBsb0F1ZGllbmNlIn0.WR3V9kkI_Pyhpw-TnpbTsByB4JZa61PFymUGdm-3_CGInbOOH6RxbMchCdbojyflSZBf3d8O7RYiz2xiMoonkOcJc6gtO0ODCv-cUDPJYApwJVYOq1HEqSs0STvKdSjRZF6j0DM4WON6fpoVwKAq0rwng1aEf9bQue6Pl-fwbzbaCxhCrQtDyDYKyfO0tg-VMGQfMyV29Ab0s4W2L5bcB0w0jAgfFianAD2DKSDSVsDSiBTd7b-Np9OcEtBvXCkXMFEqGzkOIKGAR5kzTiOWPo_Dh9qOVlsooRtFbhOjxWqeYRR76fZ-OOt9Sg6eG5zu1T7lPNywKFeAznS2rss1ig",
  "message": "OK"
}

請注意,此處的expiration指示訪問令牌將在1分鍾后過期 如果我在61秒后發送帶有這些令牌的請求:

GET http://localhost:56435/api/ConversorAlturas/PesMetros/1.13 HTTP/1.1
Authorization : Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6WyJ1c3VhcmlvMDEiLCJ1c3VhcmlvMDEiXSwianRpIjoiZTk0ZDU3NTMwZTczNDMzMTlkYjVlN2EwMDY2YjQwOTUiLCJuYmYiOjE1MzU1OTE1MzAsImV4cCI6MTUzNTU5MTU5MCwiaWF0IjoxNTM1NTkxNTMwLCJpc3MiOiJFeGVtcGxvSXNzdWVyIiwiYXVkIjoiRXhlbXBsb0F1ZGllbmNlIn0.WR3V9kkI_Pyhpw-TnpbTsByB4JZa61PFymUGdm-3_CGInbOOH6RxbMchCdbojyflSZBf3d8O7RYiz2xiMoonkOcJc6gtO0ODCv-cUDPJYApwJVYOq1HEqSs0STvKdSjRZF6j0DM4WON6fpoVwKAq0rwng1aEf9bQue6Pl-fwbzbaCxhCrQtDyDYKyfO0tg-VMGQfMyV29Ab0s4W2L5bcB0w0jAgfFianAD2DKSDSVsDSiBTd7b-Np9OcEtBvXCkXMFEqGzkOIKGAR5kzTiOWPo_Dh9qOVlsooRtFbhOjxWqeYRR76fZ-OOt9Sg6eG5zu1T7lPNywKFeAznS2rss1ig

響應將是:

HTTP/1.1 401 Unauthorized
Server: Kestrel
WWW-Authenticate: Bearer error="invalid_token", error_description="The token is expired"
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcc3RyZWFteHVcRG93bmxvYWRzXEFTUE5FVENvcmUyX0pXVC1tYXN0ZXJcQVNQTkVUQ29yZTJfSldULW1hc3RlclxBUElBbHR1cmFzXEFQSUFsdHVyYXNcYXBpXENvbnZlcnNvckFsdHVyYXNcUGVzTWV0cm9zXDEuMTM=?=
X-Powered-By: ASP.NET
Date: Thu, 30 Aug 2018 01:17:02 GMT
Content-Length: 0

請注意錯誤消息是"invalid_token", error_description="The token is expired"

我不確定您是否將到期時間設置為1分鍾。 但是,最好先檢查一下。如果沒有幫助,請轉到步驟2。

  1. 由於上面的代碼中沒有足夠的信息,因此建議您檢查以下列表:

一種)。 遭受invalid_token時,發送給控制器的承載是什么?

B)。 您的Configuracao什么? Configuracao.Configuration = Configuration;的語句Configuracao.Configuration = Configuration; 讓我感到困惑。 您能告訴我們Configuracao嗎?

B)。 我注意到您和本教程都使用了一種自定義的身份驗證/授權方式,而不是標准的UseAuthentication() 我也不確定app.UseMiddleware<AutenticacaoMiddleware<Autenticacao>>()是什么意思。 您能給我們看看AutenticacaoMiddlewareAutenticacao嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM