2016-11-17 21 views
5

ile çalışmaz. JWT tabanlı güvenliği ASP.Net Core'da uygulamak istiyorum. Tek yapmam gereken şey, şimdilik, Authorization başlığındaki taşıyıcı belirteçlerini okumak ve bunları kriterlerime göre doğrulamaktır. ASP.Net Kimliğini dahil etmem (ve istemiyorum) istemiyorum. Aslında, gerçekten ihtiyaç duymadıkça, MVC'nin mümkün olduğu kadar çok şey eklemekten kaçınmaya çalışıyorum.ASP.NET Çekirdek Yetkilendirme özniteliği JWT

Bu sorunu gösteren minimal bir proje oluşturdum. Orijinal kodu görmek için düzenleme geçmişine bakın. Authorization HTTP üstbilgisini karşılık gelen bir taşıyıcı belirteciyle sağlamadıkça, bu örneği/api/simgeleri için tüm istekleri reddetmek için bekliyordum. örneği aslında tüm isteklere izin verir.

Startup.cs

using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 
using Microsoft.Extensions.Configuration; 
using Microsoft.AspNetCore.Routing; 
using Microsoft.IdentityModel.Tokens; 
using System.Text; 
using System; 
using Newtonsoft.Json.Serialization; 

namespace JWTSecurity 
{ 
    public class Startup 
    { 
     public IConfigurationRoot Configuration { get; set; } 

     public Startup(IHostingEnvironment env) 
     { 
      IConfigurationBuilder builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath); 
      Configuration = builder.Build(); 
     } 

     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddOptions(); 
      services.AddAuthentication(); 
      services.AddMvcCore().AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver()); 
     } 

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddConsole(); 
      app.UseJwtBearerAuthentication(new JwtBearerOptions 
      { 
       AutomaticAuthenticate = true, 
       AutomaticChallenge = true, 
       TokenValidationParameters = new TokenValidationParameters 
       { 
        ValidateIssuerSigningKey = true, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("supersecretkey")), 
        ValidateIssuer = false, 
        ValidateAudience = false, 
        ValidateLifetime = true, 
        ClockSkew = TimeSpan.Zero 
       } 
      }); 
      app.UseMvc(routes => routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}")); 
     } 
    } 
} 

Kontrolörler/IconsController.cs

using Microsoft.AspNetCore.Authorization; 
using Microsoft.AspNetCore.Mvc; 

namespace JWTSecurity.Controllers 
{ 
    [Route("api/[controller]")] 
    public class IconsController : Controller 
    { 
     [Authorize] 
     public IActionResult Get() 
     { 
      return Ok("Some content"); 
     } 
    } 
} 
+0

Yetkisiz niteliğini uygulanan yöntem ve sınıfları gösterebilir Json Web Token [Yetkilendirme (AuthenticationSchemes = "Hamiline")] ile Hamiline için Yetki özniteliği Kimlik Doğrulama Düzenleri ekle? –

+0

JWT jeton ara yazılımınız nerede? Hizmetiniz/jeton son noktası veya benzer bir şekilde bir JWT'yi düzgün bir şekilde oluşturuyor mu? – SledgeHammer

+0

Bu noktada, jeton üretmekten umrumda değil, sadece başlıklarda belirteci olmayan her şeyi reddediyorum. –

cevap

21

Buldum!

temel sorun bu satırda geçerli: AddMvc() için AddMvcCore() geçiş yaparak, yetki aniden çalışmaya başladığını

services.AddMvcCore().AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver()); 

fark ettim! the ASP.NET source code'dan kazandıktan sonra, AddMvc()'un ne yaptığını görmek için, IMvcBuilder.AddAuthorization()'a ikinci bir aramaya ihtiyacım olduğunu anladım.

services.AddMvcCore() 
    .AddAuthorization() // Note - this is on the IMvcBuilder, not the service collection 
    .AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver()); 
+1

Bu da beni yakaladı ('AddMvcCore' kullanıyorum çünkü). AddAuthorization() öğesine yapılan çağrı, ['AuthorizationApplicationModelProvider'] öğesini (https://github.com/aspnet/Mvc/blob/760c8f38678118734399c58c2dac981ea6e47046/src/Microsoft.AspNetCore.Mvc.Core/Internal/AuthorizationApplicationModelProvider.cs) ekler. Denetleyicilere Yetki Verme/İzin Verme için ve uygun ilkeleri ekler. –

+0

Talep doğrulama için bunları kullanırsanız AddDataAnnotations'ı da unutmayın! –

6

Ayrıca kimlik doğrulaması kullanıyorsanız ve örtük çerez kimlik doğrulamasını içerir. Muhtemelen kimlik şemasıyla giriş yaptınız ve başarılı bir kimlik doğrulamasına neden oldu. (Yalnızca jwt kimlik istiyorsanız) aksi Authorize nitelik aşağıda benzerleri için Bearer düzeni belirtmek gerekli değilse

Kaldır kimlik doğrulama:

[Authorize(ActiveAuthenticationSchemes = "Bearer")] 
+0

Geri döndüğümde bunu deneyeceğim yarın çalışmak için, umarım haklısınız.Onunla ilgili olarak, kimlik kullanmamın nedeni sadece parola karmaşasını gizlemek/soyutlamaktır. Hangi alternatifi önerirsiniz? –

+0

Kimlik tavsiye edilen çözümdür. Anladığım kadarıyla y Kimlik kullanmak ve isteğe bağlı olarak jwt kullanmak. Bu durumda kısıtlamak için kimlik doğrulama şemasını belirtmelisiniz. Örneğin, yalnızca jwt kimlik doğrulaması istiyorsanız, taşıyıcı şemasını kullanmalısınız. –

+0

Her iki seçeneği de denedim (yalnızca Kimlik ve yalnızca JWT) ve ayrıca her ikisi için de 'ActiveAuthenticationShemes' özelliğini kullanmayı denediniz. –

-1

+0

Bu, Adem Caglin'in yukarıdaki cevabının bir kopyası. Bu soru hakkındaki yorumları okursanız veya bu sorunun kabul edilmiş bir cevabı olduğu gerçeğine baktığınızda, bu cevabın sorunu çözmediğini fark etmiş olursunuz. –

İlgili konular