Home ASP.NET Core Web API - JWT Authentication Kullanımı
Post
Cancel

ASP.NET Core Web API - JWT Authentication Kullanımı

Merhabalar bu makalede .Net Core 3.1 versiyonu ile bir Web API örnek projede JWT (JSON Web Token) kimlik doğrulama yapısını inceleyeceğim. Daha önceki Web API makalelerine buradan ulaşabilirsiniz. Uygulama dosyalarını aspnetcore-3-1-web-api-jwt Github adresinde bulabilirsiniz.

ASP.NET Core Web API – User Entity

Kullanıcı bilgilerini taşıdığımız user sınıfını oluşturuyorum. Entity yapıları uygulamanın farklı bölümlerinde veri iletimi için kullanılır. Ayrıca controller yardımıyla http yanıtlarını döndürmek içinde kullanılabilmektedir. Bu sınıfı veritabanındaki User tablosu olarak düşünebilirsiniz. Entities sınfıları Entityframework ile Code First yaklaşımında veritabanı tablolarını oluşturmak için kullandığımız sınıflarıdır. Not: Entities yapılarında kısıtlı veri döndürmek istendiğinde Models klasöründe ihtiyaca yönelik sınıflar kullanılmalıdır.

1
2
3
4
5
6
7
8
9
10
11
12
namespace WebApi.Entities
{
    public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Token { get; set; }
    }
}

ASP.NET Core Web API – Item Entity

Ürün bilgilerini tuttuğumuz Item sınıfını veritabanında Item tablosu olarak düşünebilirsiniz.

1
2
3
4
5
6
7
8
9
10
11
namespace WebApi.Entities
{
    public class Item
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }
        public float Price { get; set; }
        public int Amount { get; set; }
    }
}

ASP.NET Core Web API – AuthModel

AuthModel token bilgisi almak için istemcinin göndermiş olduğu istekte User sınıfının sadece username ve password bilgisini parametre olarak göndermesi için kısıtlı bir sınıftır.

1
2
3
4
5
public class AuthModel
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

ASP.NET Core Web API – Startup

Startup ​​sınıfı, uygulamanın tüm isteklerin nasıl işleneceğini yapılandırdığımız sınıftır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    var appSettingSection = Configuration.GetSection("AppSettings");
    services.Configure<AppSettings>(appSettingSection);
    var appSettings = appSettingSection.Get<AppSettings>();
    var key = Encoding.ASCII.GetBytes(appSettings.Secret);
    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(key), ValidateIssuer = false,
            ValidateAudience = false
        };
    });
    services.AddScoped<IUserService, UserService>();
    services.AddScoped<IItemService, ItemService>();
}
1
2
3
4
5
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseAuthentication();
    app.UseAuthorization();
}

ASP.NET Core Web API – UserService

UserService sınıfında IUserService interface dosyasından implement ettikten sonra statik olarak bir User listesi dolduruyorum. Bu User verisi ile Authenticate metodunda UserName ve Password kontrolü ile user nesnesi geriye döndürüyorum.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
namespace WebApi.Services
{
    public interface IUserService
    {
        User Authenticate(string userName, string password);
        List<User> GetAll();
    }

    public class UserService : IUserService
    {
        readonly AppSettings _appSettings;

        private List<User> _users = new List<User>
            {new User {Id = 1, FirstName = "Murat", LastName = "Suzen", UserName = "murat", Password = "1234"}};

        public UserService(IOptions<AppSettings> appSettings)
        {
            _appSettings = appSettings.Value;
        }

        public User Authenticate(string userName, string password)
        {
            var user = _users.FirstOrDefault(x => x.UserName == userName && x.Password == password);
            if (user == null) return null;
            var tokenHandler = new JwtSecurityTokenHandler();
            var key = Encoding.UTF8.GetBytes(_appSettings.Secret);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[] {new Claim(ClaimTypes.Name, user.Id.ToString())}),
                Expires = DateTime.UtcNow.AddDays(7),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key),
                    SecurityAlgorithms.HmacSha256Signature)
            };
            var token = tokenHandler.CreateToken(tokenDescriptor);
            user.Token = tokenHandler.WriteToken(token);
            user.Password = null;
            return user;
        }

        public List<User> GetAll()
        {
            return _users;
        }
    }
}

ASP.NET Core Web API – ItemService

ItemService sınıfınıd IItemService interface dosyasından implemente ediyorum. Bu sınıfta ürünler listesini geri döndüreceğimiz metodu yazalım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace WebApi.Services
{
    public interface IItemService
    {
        List<Item> GetAll();
    }

    public class ItemService : IItemService
    {
        private List<Item> _items = new List<Item>
        {
            new Item {Id = 1, Code = "0001", Name = "Notebook", Amount = 22, Price = 6300},
            new Item {Id = 2, Code = "0002", Name = "Keyboard", Amount = 15, Price = 230},
            new Item {Id = 3, Code = "0003", Name = "Mouse", Amount = 9, Price = 150},
        };

        public List<Item> GetAll()
        {
            return _items.ToList();
        }
    }
}

##ASP.NET Core Web API – ItemController

ItemController sınıfı [Authorize] attribute ile yetkilendirildiği için UserName ve Password gönderilerek işlem yapılabilir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace WebApi.Controllers
{
    [Authorize]
    [Route("[controller]")]
    [ApiController]
    public class ItemController : ControllerBase
    {
        private IItemService _itemService;

        public ItemController(IItemService itemService)
        {
            _itemService = itemService;
        }

        [HttpGet]
        public ActionResult GetAll()
        {
            var users = _itemService.GetAll();
            return Ok(users);
        }
    }
}

ASP.NET Core Web API – UserController

Not: Tüm controller sınıfının [Authorize] attribute ile yetkilendirilmesi yanlızca [AllowAnonymous] attribute içeren metotları kapsamamaktadır. Çünkü [AllowAnonymous] attribute içeren metotlar [Authorize] attribute yapısını ezmektedir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[Authorize]
[Route("[controller]")]
[ApiController]
public class UserController : ControllerBase
{
    private IUserService _userService;

    public UserController(IUserService userService)
    {
        _userService = userService;
    }

    [AllowAnonymous]
    [HttpPost("auth")]
    public ActionResult Authenticate([FromBody] AuthModel authModel)
    {
        var user = _userService.Authenticate(authModel.UserName, authModel.Password);
        if (user == null) return BadRequest(new {message = "Kullanıcı adı yada şifre yanlış"});
        return Ok(user);
    }

    [HttpGet]
    public ActionResult GetAll()
    {
        var users = _userService.GetAll();
        return Ok(users);
    }
}

ASP.NET Core Web API – AppSettings

1
2
3
4
public class AppSettings
{
    public string Secret { get; set; }
}

ASP.NET Core Web API – appsettings.json

1
2
3
  "AppSettings": {
    "Secret": "BU ALANA IMZA ICIN BIR ANAHTAR BILGISI GIRMEMIZ GEREKMEKTEDIR"
}

Postman ile Kullanımı

Proje içeren dosyaları indirdiğimizde aspnetcore-3-1-web-api-jwt\WebApi klasöründeki WebApi.sln projesini açıp çalıştırıyoruz.

JWT Project Folder JWT Project Folder

Postman ile öncelikle user servisine username ve password gönderip bir post işlemi yapıyoruz. Bu şekilde token bilgisini elde etmiş oluyoruz.

JWT Post Auth JWT Post Auth

Daha sonra elde ettiğimiz token bilgisi ile user servisine get işlemi yapıyoruz ve user listelerine erişebiliyoruz.

JWT Get User JWT Get User

This post is licensed under CC BY 4.0 by the author.

Web API ve Angular 8 ile Blob Veri Tipi Kullanımı

ASP.NET Core Web API - Basic Authentication Kullanımı