2017-02-07 13 views
4

Я использую openiddict, который выполнен с возможностью использовать JSON веб-маркеры:.net ядро ​​- ключ подписи подлинности промежуточного JWT игнорируется

// Add authentication 
services.AddAuthentication(); 

// Add OpenId Connect/OAuth2 
services.AddOpenIddict() 
    .AddEntityFrameworkCoreStores<ApplicationDbContext>() 
    .AddMvcBinders() 
    .EnableTokenEndpoint("/connect/token") 
    .AllowPasswordFlow() 
    .AllowRefreshTokenFlow() 
    .UseJsonWebTokens()  // access_token should be jwt 
    // You can disable the HTTPS requirement during development or if behind a reverse proxy 
    .DisableHttpsRequirement() 
    // Register a new ephemeral key, that is discarded when the application 
    // shuts down. Tokens signed using this key are automatically invalidated. 
    // To be used during development 
    .AddEphemeralSigningKey(); 

Я настроен JWT промежуточного слоя в следующем порядке:

// Add Jwt middleware for authentication 
var secretKey = Configuration.Get<AppOptions>().Jwt.SecretKey; 
app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    RequireHttpsMetadata = env.IsProduction(), 
    Audience = Configuration.Get<AppOptions>().Jwt.Audience, 
    Authority = Configuration.Get<AppOptions>().Jwt.Authority, 
    TokenValidationParameters = new TokenValidationParameters 
    { 
     ValidateIssuerSigningKey = true, 
     IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)), 

     ValidateIssuer = true, 
     // makes no difference seemingly being ignored 
     //ValidIssuer = Configuration.Get<AppOptions>().Jwt.Authority, 

     ValidateAudience = true, 
     ValidAudience = Configuration.Get<AppOptions>().Jwt.Audience, 

     ValidateLifetime = true, 
    } 
}); 

// Add OpedId Connect middleware 
app.UseOpenIddict(); 

Как вы можете видеть, ключ подписи эмитента устанавливается на симметричном ключе:

IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)), 

но JWT согл ess_tokens создано уже alg требование установлено в RS256, так что кажется, что этот параметр игнорируется и openiddict использует закрытый ключ RSA подписать маркер генерируется из

.AddEphemeralSigningKey(); 

ответ

2

Для того, чтобы заставить openiddict использовать симметричный ключ он должен быть сконфигурировано в openiddict

services.AddOpenIddict() 
.AddEntityFrameworkCoreStores<ApplicationDbContext>() 
.AddMvcBinders() 
.EnableTokenEndpoint("/connect/token") 
.AllowPasswordFlow() 
.AllowRefreshTokenFlow() 
.UseJsonWebTokens() 
// You can disable the HTTPS requirement during development or if behind a reverse proxy 
.DisableHttpsRequirement() 

// set your symmetric key 

.AddSigningKey(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.Get<AppOptions>().Jwt.SecretKey))); 
+0

на самом деле нет, вам нужно реги запустите ключ подписи как в параметрах OpenIddict, так и в вариантах промежуточного программного обеспечения канала JWT. – Pinpoint

+0

@Pinpoint Он работает отлично для меня, просто установив его в OpenIdDictservice –

+0

Я действительно сомневаюсь в этом. Если вы не зарегистрируете свой симметричный ключ подписи в параметрах промежуточного программного обеспечения JWT, IdentityModel (библиотека JWT за промежуточным программным обеспечением JWT) выдает «SecurityTokenInvalidSignatureException» ('IDX10500: проверка подписи не была выполнена. Для проверки подлинности не было обеспечено никаких ключей безопасности), и ваши пользователи никогда не будут аутентифицированы. – Pinpoint

0

в .NET 2.0, вы должны также зарегистрировать ключ в JWT промежуточного слоя, как показано ниже:

services.AddAuthentication(opt => { 
       opt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 
       opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 
      }) 
      .AddJwtBearer(options => 
      { 
       options.RequireHttpsMetadata = false; 
       options.SaveToken = true; 
       //options.Audience = "http://localhost:13818/"; 
       //options.Authority = "http://localhost:13818/";     
       options.TokenValidationParameters = new 
       TokenValidationParameters 
       { 
        ValidateIssuerSigningKey = true, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("iNivDmHLpUA223sqsfhqGbMRdRj1PVkH")), 
        ValidateIssuer = true, 
        ValidateAudience = true, 
        ValidateLifetime = true 
       }; 
      }); 

 Смежные вопросы

  • Нет связанных вопросов^_^