Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Authentication ve authorization, güvenlik açısından iki temel kavramdır ve genellikle birlikte kullanılırlar, ancak farklı amaçlara hizmet ederler.
[HttpPost]
public async Task<IActionResult> Login(LoginModel model)
{
var user = await _userManager.FindByNameAsync(model.Username);
if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
{
// Kullanıcı doğrulandı
// Token oluşturulur veya oturum açma işlemi gerçekleştirilir
return Ok("Authentication successful");
}
// Doğrulama başarısız
return Unauthorized();
}
Authorization (Yetkilendirme): Authorization, doğrulanmış kullanıcıların belirli kaynaklara veya eylemlere erişim izinlerini kontrol etme sürecidir. Yani, authentication işleminden sonra, authorization işlemi gerçekleşir. Yetkilendirme, kullanıcıların kimlik doğrulamasını geçtikten sonra belirli bir kaynağa veya eyleme erişip erişemeyeceğini belirler. Bu genellikle kullanıcıların rollerine, izinlerine veya diğer kimlik belirteçlerine dayanır.
Örnek bir kod parçası:
[Authorize(Roles = "Admin")]
[HttpGet("admin")]
public IActionResult AdminPage()
{
// Sadece Admin rolüne sahip kullanıcılar bu sayfaya erişebilir
return Ok("Welcome Admin!");
}
Authentication ve authorization, web uygulamalarının güvenliğini sağlamak için önemlidir. Authentication, doğru kullanıcıların sistemde oturum açmasını sağlar, authorization ise bu kullanıcıların sistemdeki kaynaklara ve işlemlere erişimini kontrol eder. İkisi birlikte çalışarak, sistemlerin güvenliğini sağlamak için güçlü bir mekanizma oluştururlar.
Cookie tabanlı kimlik doğrulama ve token tabanlı kimlik doğrulama, web uygulamalarında kullanılan iki yaygın kimlik doğrulama yöntemidir. Her birinin avantajları ve dezavantajları vardır ve kullanılacak senaryoya göre tercih edilebilirler.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Account/AccessDenied";
});
Token Tabanlı Kimlik Doğrulama:
Nasıl Çalışır: Kullanıcı kimliği doğrulandığında, sunucu bir JWT (JSON Web Token) gibi bir belirteç oluşturur ve bu belirteci istemciye gönderir. İstemci, bu belirteci saklar ve her istekle birlikte sunucuya gönderir. Sunucu, bu belirteci doğrular ve kullanıcının kimliğini belirler.
Avantajları:
CSRF Saldırılarına Dirençli: Tokenler, CSRF saldırılarına karşı daha dirençlidir, çünkü istemciye gönderilen belirteçler doğrulanmalıdır.
Ölçeklenebilirlik: Oturum verilerinin sunucu tarafında saklanmasına gerek olmadığından, ölçeklenebilirlik açısından daha iyidir.
Dezavantajları:
Komplekslik: Token tabanlı kimlik doğrulama, uygulamanın biraz daha karmaşık olmasına neden olabilir.
Ekstra Geliştirme: Tokenleri doğrulamak ve yönetmek için ekstra kod yazmak gerekir.
Örnek bir ASP.NET Core kod parçası:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
Her iki yaklaşımın da kendine özgü avantajları ve dezavantajları vardır. Uygulamanın gereksinimlerine ve güvenlik politikalarına bağlı olarak, uygun olanı seçilmelidir.
Identity platform, kullanıcıların kimlik doğrulama ve yetkilendirme işlemlerini yönetmek için kullanılan bir hizmet veya sistemdir. Bu platformlar, genellikle kullanıcıların kimliklerini doğrulamak, kullanıcıları yönetmek, oturum yönetimini sağlamak, yetkilendirme politikalarını uygulamak ve güvenlikle ilgili diğer görevleri yerine getirmek için kullanılır.
ASP.NET Core Identity Framework, bir identity platform örneğidir. ASP.NET Core Identity, .NET Core tabanlı web uygulamaları için entegre bir kimlik ve erişim yönetimi çözümü sunar. Bu çözüm, kullanıcıların kimliklerini doğrulamak, kullanıcıları yönetmek, rolleri ve izinleri tanımlamak, oturum yönetimini sağlamak ve diğer kimlik ve erişim yönetimi işlevlerini yerine getirmek için kullanılır.
ASP.NET Core Identity, .NET Core web uygulamalarında kimlik doğrulama ve yetkilendirme işlemlerini sağlamak için kullanılır. Bu çerçeve, kullanıcıların kaydını oluşturmayı, oturum açmayı, rolleri ve izinleri yönetmeyi, parola sıfırlama işlemlerini gerçekleştirmeyi ve diğer kimlik ve erişim yönetimi işlevlerini kolaylaştırmayı sağlar.
Örnek bir ASP.NET Core Identity kullanımı:
Özetle, identity platformlar, kimlik doğrulama ve yetkilendirme işlemlerini yönetmek ve web uygulamalarında güvenlik sağlamak için kullanılır. ASP.NET Core Identity, .NET Core tabanlı uygulamalarda kimlik yönetimi işlemlerini kolaylaştıran bir identity platform örneğidir. Bu çözüm, kullanıcıların kimliklerini doğrulamak, oturum yönetimi sağlamak, kullanıcıları yönetmek ve diğer kimlik ve erişim yönetimi işlevlerini yerine getirmek için kullanılabilir.
JSON Web Token (JWT), modern web uygulamalarında kullanılan bir kimlik doğrulama ve yetkilendirme mekanizmasıdır. JWT, JSON formatında verileri taşıyan ve dijital olarak imzalanmış bir belirteçtir. Genellikle kullanıcı oturumlarını yönetmek, güvenli bir şekilde kimlik doğrulama ve yetkilendirme bilgilerini taşımak için kullanılır.
JWT’nin temel yapısı üç bölümden oluşur: başlık (header), yük (payload) ve imza (signature).
{
"alg": "HS256",
"typ": "JWT"
}
Yük (Payload): JWT’nin yük bölümü, taşınacak verileri içerir. Bu veriler, kullanıcı bilgileri, roller, izinler gibi kimlik doğrulama ve yetkilendirme bilgilerini içerebilir. Örnek bir yük JSON nesnesi şu şekilde olabilir:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
JWT’nin yaygın kullanım senaryoları şunlardır:
Örnek bir JWT oluşturma ve doğrulama işlemi ASP.NET Core için şu şekilde yapılabilir:
// JWT oluşturma
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("my_secret_key");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, "John Doe"),
new Claim(ClaimTypes.Role, "Admin"),
// Diğer talep (claim) bilgileri buraya eklenebilir
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
// JWT doğrulama
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
RequireExpirationTime = true,
ValidateLifetime = true
};
var tokenHandler = new JwtSecurityTokenHandler();
var claimsPrincipal = tokenHandler.ValidateToken(tokenString, tokenValidationParameters, out var validatedToken);
// Token doğrulandıktan sonra, talep (claim) bilgilerine erişilebilir
Bu örnek, bir JWT oluştururken kullanıcı bilgilerini ve rol bilgilerini içeren bir JWT yaratır. Ayrıca, JWT’nin doğrulama sürecini gösterir, yani JWT’nin imzasını doğrular ve içindeki bilgileri çözer.
Token tabanlı kimlik doğrulama için Entity Framework Core (EF Core) kullanarak bir veritabanı bağlantısı kurmak oldukça yaygın bir uygulamadır. Bu, kullanıcı bilgilerini ve yetkilendirme verilerini saklamak için veritabanı kullanmanın tipik bir yoludur.
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
Veritabanı Bağlantı Dizesini Ayarlama: appsettings.json veya appsettings.Development.json dosyasına veritabanı bağlantı dizesini ekleyin:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Veritabanı Bağlantısını Yapılandırma: ConfigureServices yöntemi içinde, DbContext sınıfını ve bağlantı dizesini yapılandırın:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// Diğer servis yapılandırmaları...
}
Veritabanı Bağlantısını Kullanarak Model Oluşturma: Veritabanında saklanacak olan veri modellerini tanımlayın. Örneğin, bir kullanıcı modeli:
public class ApplicationUser : IdentityUser
{
// Kullanıcıya özgü alanlar...
}
Migration’lar Oluşturma ve Veritabanına Uygulama: Entity Framework Core Migration aracını kullanarak veritabanında değişiklikler için migration’lar oluşturun ve ardından bu değişiklikleri veritabanına uygulayın:
dotnet ef migrations add InitialCreate
dotnet ef database update
Bu adımları takip ederek, ASP.NET Core projesinde EF Core kullanarak bir veritabanı bağlantısı kurabilirsiniz. Bu sayede, kullanıcıların kimlik bilgilerini ve yetkilendirme verilerini veritabanında saklayabilir ve token tabanlı kimlik doğrulaması için gereken verilere erişebilirsiniz.
ASP.NET Core uygulamalarında kimlik doğrulama ve yetkilendirme işlemleri için varsayılan olarak sunulan Identity Framework’ü kullanmak oldukça yaygındır. Entity Framework Core (EF Core) ile birlikte Identity Framework’ü kullanarak, kullanıcıları ve rolleri saklamak için veritabanında varsayılan tabloları oluşturmak oldukça kolaydır.
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
DbContext Sınıfını Oluşturmak: EF Core tarafından kullanılacak olan DbContext sınıfını oluşturun ve IdentityDbContext sınıfını genişletin. Bu sınıf, Identity Framework’ün varsayılan tablolarını içerecektir.
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
Startup Sınıfında Servisleri Yapılandırmak: ConfigureServices yöntemi içinde, Identity Framework’ü ve DbContext’i yapılandırın:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
// Diğer servis yapılandırmaları...
}
Migration’lar Oluşturma ve Veritabanına Uygulama: Şimdi, Entity Framework Core Migration aracını kullanarak Identity Framework tarafından tanımlanan varsayılan tablolar için bir migration oluşturun ve bu değişiklikleri veritabanına uygulayın:
dotnet ef migrations add InitialIdentity
dotnet ef database update
Bu adımları takip ederek, EF Core kullanarak Identity Framework’ün varsayılan tablolarını veritabanında oluşturabilirsiniz. Bu tablolar, kullanıcıları, rolleri, parola hash’lerini ve diğer kimlik doğrulama ve yetkilendirme verilerini saklar. Bu sayede, ASP.NET Core uygulamanızda kullanıcı kimlik doğrulama ve yetkilendirme işlemlerini kolayca gerçekleştirebilirsiniz.
Token tabanlı kimlik doğrulama için ASP.NET Core’da yapılandırma oldukça önemlidir. Token tabanlı kimlik doğrulama, JWT gibi bir tokenin kullanıcı kimliğini doğrulamak için kullanılmasını içerir.
Microsoft.AspNetCore.Authentication.JwtBearer
NuGet paketini kullanabilirsiniz:dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Authentication Middleware Ayarlarını Yapılandırma: ConfigureServices
yöntemi içinde, JWT tabanlı kimlik doğrulama için gerekli servisleri ve yapılandırmaları ekleyin:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your-issuer",
ValidAudience = "your-audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
};
});
// Diğer servis yapılandırmaları...
}
Authentication Middleware’i Kullanma: Configure
yöntemi içinde, kimlik doğrulama middleware’ini ekleyin ve kullanın:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Diğer middleware'ler...
app.UseAuthentication();
app.UseAuthorization();
// Diğer middleware'ler...
}
Bu adımları takip ederek, ASP.NET Core uygulamanızda token tabanlı kimlik doğrulama sağlayabilirsiniz. Bu yapılandırmada, JWT tokenlerinin doğruluğu, hangi ISSUER ve AUDIENCE’ye ait olduğu gibi kritik güvenlik kontrolleri sağlanmaktadır. Ayrıca, bu yapılandırmada kullanılan güvenlik anahtarını (secret key) korumak da büyük önem taşır.
Token tabanlı kimlik doğrulama için ASP.NET Core’da bir kimlik doğrulama kontrolcüsü eklemek oldukça önemlidir. Bu kontrolcü, kullanıcıların kimlik bilgilerini doğrulamak ve JWT tokenleri almak için kullanılır.
AuthenticationController
adında bir kontrolcü oluşturalım:using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[Route("api/[controller]")]
[ApiController]
public class AuthenticationController : ControllerBase
{
private readonly IConfiguration _configuration;
public AuthenticationController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost]
[Route("login")]
public IActionResult Login(string username, string password)
{
// Kullanıcı adı ve şifreyi doğrula (örneğin, veritabanından kontrol edilebilir)
// Kullanıcı bilgileri doğrulanırsa, JWT oluştur
var token = GenerateJwtToken(username);
// Tokeni istemciye dön
return Ok(new { token });
}
private string GenerateJwtToken(string username)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["Jwt:ExpiryInMinutes"])),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
Konfigürasyon Eklemek: Uygulamanızın yapılandırma dosyasına (örneğin, appsettings.json
) JWT ayarlarını ekleyin:
{
"Jwt": {
"Issuer": "your-issuer",
"Audience": "your-audience",
"SecretKey": "your-secret-key",
"ExpiryInMinutes": 60
}
}
Dependency Injection Ayarlarını Yapmak: Startup.cs
dosyasında, AuthenticationController
‘a bağlı olan IConfiguration servisini yapılandırın:
public void ConfigureServices(IServiceCollection services)
{
// Diğer servis yapılandırmaları...
services.AddSingleton(Configuration);
// Diğer servis yapılandırmaları...
}
Bu adımları takip ederek, ASP.NET Core uygulamanıza bir kimlik doğrulama kontrolcüsü ekleyebilir ve kullanıcıların kimlik bilgilerini doğrulamak ve JWT tokenleri almak için kullanabilirsiniz. Bu kontrolcü, kullanıcı giriş isteklerini alır, kullanıcı bilgilerini doğrular ve başarılı olursa bir JWT tokeni oluşturur ve kullanıcıya geri gönderir.
ASP.NET Core’da Token tabanlı kimlik doğrulama kullanırken, yeni kullanıcıların kaydedilmesi ve yönetilmesi için UserManager
sınıfını kullanabilirsiniz. UserManager
sınıfı, ASP.NET Core Identity Framework’ünün bir parçasıdır ve kullanıcı oluşturma, silme, parola değiştirme vb. gibi işlemleri kolaylaştırır.
UserManager
sınıfını kullanabilmek için Startup.cs
dosyasında ConfigureServices
metoduna UserManager
‘ı ekleyin:public void ConfigureServices(IServiceCollection services)
{
// Diğer servis yapılandırmaları...
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>>();
// Diğer servis yapılandırmaları...
}
Kullanıcı Oluşturma İşlemi: Şimdi, yeni bir kullanıcı oluşturmak için UserManager
‘ı kullanabiliriz. Öncelikle, ApplicationUser
sınıfınızı tanımlamanız gerekecek. Bu sınıf, kullanıcı verilerini temsil eder. Daha sonra, UserManager
sınıfını kullanarak yeni bir kullanıcı oluşturabiliriz. Aşağıda bir örnek kod bulunmaktadır:
using Microsoft.AspNetCore.Identity;
public class UserController : ControllerBase
{
private readonly UserManager<ApplicationUser> _userManager;
public UserController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
[HttpPost]
[Route("register")]
public async Task<IActionResult> Register(string username, string password)
{
var user = new ApplicationUser { UserName = username };
var result = await _userManager.CreateAsync(user, password);
if (result.Succeeded)
{
// Kullanıcı başarıyla oluşturuldu
return Ok("User created successfully.");
}
else
{
// Kullanıcı oluşturulurken bir hata oluştu, hataları döndür
return BadRequest(result.Errors);
}
}
}
Bu örnekte, Register
metodu, yeni bir kullanıcı oluşturmak için kullanılır. Kullanıcı adı ve şifre alınır, ardından UserManager
kullanılarak yeni bir ApplicationUser
nesnesi oluşturulur ve CreateAsync
metoduyla veritabanına eklenir. CreateAsync
metodu bir IdentityResult
döndürür, bu nedenle işlem başarılıysa Ok
durum koduyla birlikte bir mesaj döndürülür. Aksi takdirde, hatalar BadRequest
ile döndürülür.
Bu adımları takip ederek, ASP.NET Core uygulamanızda yeni kullanıcıları UserManager
kullanarak kolayca kaydedebilirsiniz. Bu sayede, kullanıcı kayıt işlemlerini basitleştirebilir ve kullanıcıların uygulamanıza kaydolmasını sağlayabilirsiniz.
Token tabanlı kimlik doğrulama ile kullanıcıların giriş yapması, kullanıcı adı ve şifrelerini doğrulamak ve bir JWT (JSON Web Token) oluşturmakla ilgilidir. Bu işlem, giriş isteği gönderen kullanıcının kimliğini doğrulamak için kullanılır.
[Route("api/[controller]")]
[ApiController]
public class AuthenticationController : ControllerBase
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
public AuthenticationController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
[HttpPost]
[Route("login")]
public async Task<IActionResult> Login(LoginViewModel model)
{
var user = await _userManager.FindByNameAsync(model.UserName);
if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
{
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var signinKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
expires: DateTime.UtcNow.AddHours(1),
claims: claims,
signingCredentials: new SigningCredentials(signinKey, SecurityAlgorithms.HmacSha256)
);
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token),
expiration = token.ValidTo
});
}
return Unauthorized();
}
}
Kullanıcıyı Giriş Yapmış Olarak İşaretleme: Başarılı bir kimlik doğrulama işleminden sonra, kullanıcıyı giriş yapmış olarak işaretlemek için SignInManager
‘ı kullanın.
var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, false, lockoutOnFailure: false);
if (result.Succeeded)
{
return Ok("User logged in successfully.");
}
else
{
return Unauthorized();
}
Bu adımları takip ederek, ASP.NET Core uygulamanızda kullanıcıların giriş yapması ve JWT token alması sağlanır. Bu token daha sonra kullanıcının herhangi bir işlem yaparken kimliğini doğrulamak için kullanılabilir.
Token tabanlı kimlik doğrulama kullanırken, erişim belirteci (access token) oluşturmak, kimlik doğrulama sonrasında kullanıcının işlem yapabilmesi için kullanılabilir. Bu access token, genellikle JWT (JSON Web Token) formatında oluşturulur ve kullanıcı kimliği ve diğer ilgili bilgileri içerir.
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
public class TokenService
{
public string GenerateAccessToken(string userId, string secretKey, string issuer, string audience, int expiryMinutes)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userId),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var signinKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.UtcNow.AddMinutes(expiryMinutes),
signingCredentials: new SigningCredentials(signinKey, SecurityAlgorithms.HmacSha256)
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
GenerateAccessToken
metodu kullanıcı kimliği (userId), gizli anahtar (secretKey), sunucu (issuer), hedef alıcı (audience) ve token geçerlilik süresi gibi parametreler alır. Bu bilgiler kullanılarak JWT oluşturulur ve string olarak döndürülür.public async Task<IActionResult> SomeAction()
{
var userId = "123"; // Örnek olarak kullanıcı kimliği
var accessToken = _tokenService.GenerateAccessToken(userId, "your_secret_key", "your_issuer", "your_audience", 60);
// Access token'ı HTTP isteği başlığına ekleme
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
// Diğer işlemler...
}
GenerateAccessToken
metodu kullanılarak bir access token oluşturulur ve ardından HTTP isteği başlığına eklenir. Bu şekilde, sunucu, kullanıcının kimliğini doğrulamak için bu token’ı kullanabilir.Access token oluşturma işlemi, kullanıcı kimliğini güvenli bir şekilde temsil eden ve kimlik doğrulama sonrasında kullanıcının yetkilendirilmesine izin veren önemli bir adımdır. Yukarıdaki adımları takip ederek, ASP.NET Core uygulamanızda access token’ları başarıyla oluşturabilirsiniz.
Token tabanlı kimlik doğrulama kullanırken, bir kullanıcının oturumu süresi dolduğunda veya güvenlik nedenleriyle oturumun yeniden doğrulanması gerektiğinde, kullanıcının mevcut access token’ını yenilemek için refresh token’lar kullanılır. Refresh token’lar, genellikle bir veritabanında saklanır ve access token’larının yenilenmesi için kullanılır.
public class RefreshToken
{
[Key]
public string UserId { get; set; }
public string Token { get; set; }
public DateTime Expires { get; set; }
}
RefreshToken
sınıfı refresh token’ları temsil eder. UserId
, kullanıcının kimliğini, Token
, refresh token’ı ve Expires
, token’ın son kullanma tarihini içerir.public class ApplicationDbContext : DbContext
{
public DbSet<RefreshToken> RefreshTokens { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<RefreshToken>()
.HasKey(rt => rt.UserId);
}
}
ApplicationDbContext
sınıfında RefreshTokens
adında bir DbSet tanımlanmıştır. Ayrıca, refresh token’ları saklamak için RefreshToken
sınıfına ait bir anahtar belirlenmiştir.dotnet ef migrations add AddRefreshTokenTable
dotnet ef database update
Refresh token tablosu, token tabanlı kimlik doğrulama işlemi sırasında kullanıcı oturumlarının güvenliğini artırmak için önemlidir. Yukarıdaki adımları takip ederek, ASP.NET Core uygulamanızda refresh token’ları başarıyla saklayabilirsiniz.
Refresh token’ların oluşturulması ve saklanması, token tabanlı kimlik doğrulama sürecinde kullanıcı oturumlarını yönetmek için önemlidir.
public class TokenService
{
public string GenerateRefreshToken()
{
var randomNumber = new byte[32];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(randomNumber);
return Convert.ToBase64String(randomNumber);
}
}
}
GenerateRefreshToken
metodu rastgele bir byte dizisi oluşturur ve bunu base64 formatında bir dizeye dönüştürerek refresh token olarak döndürür.public class RefreshTokenRepository
{
private readonly ApplicationDbContext _context;
public RefreshTokenRepository(ApplicationDbContext context)
{
_context = context;
}
public void AddRefreshToken(string userId, string refreshToken, DateTime expires)
{
var token = new RefreshToken
{
UserId = userId,
Token = refreshToken,
Expires = expires
};
_context.RefreshTokens.Add(token);
_context.SaveChanges();
}
}
AddRefreshToken
metoduyla veritabanına yeni bir refresh token eklenir. Bu token, ilgili kullanıcıya ait kimlik bilgileriyle birlikte saklanır.public class TokenService
{
public string GenerateAccessToken(string userId, string secretKey, string issuer, string audience, int expiryMinutes)
{
// Access token oluşturma işlemi...
}
public void UseRefreshToken(string userId, string refreshToken)
{
// Veritabanından refresh token'ı kontrol etme ve kullanma işlemi...
}
}
Yukarıdaki adımları takip ederek, ASP.NET Core uygulamanızda refresh token’ların oluşturulması ve saklanması sağlanabilir, böylece kullanıcı oturumları güvenli bir şekilde yönetilebilir.
TokenValidationParameters, ASP.NET Core uygulamalarında token tabanlı kimlik doğrulama sürecini yapılandırmak için kullanılan bir sınıftır. Bu sınıf, gelen token’ların doğruluğunu ve güvenilirliğini kontrol etmek için kullanılır. TokenValidationParameters’ın enjekte edilmesi, uygulamanın başlatılması sırasında yapılandırılmasını ve belirli token doğrulama parametrelerinin belirlenmesini sağlar.
public void ConfigureServices(IServiceCollection services)
{
// Diğer servislerin ekleme işlemleri...
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your_issuer",
ValidAudience = "your_audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
// Diğer servislerin ekleme işlemleri devam eder...
}
public class YourService
{
private readonly TokenValidationParameters _tokenValidationParameters;
public YourService(TokenValidationParameters tokenValidationParameters)
{
_tokenValidationParameters = tokenValidationParameters;
}
public void YourMethod()
{
// TokenValidationParameters'ı kullanarak işlemleri gerçekleştirme...
}
}
TokenValidationParameters’ın enjekte edilmesi, ASP.NET Core uygulamalarında JWT tabanlı kimlik doğrulama sürecini yapılandırmak ve belirli token doğrulama parametrelerini belirlemek için önemlidir. Bu parametreler, gelen token’ların doğruluğunu ve güvenilirliğini kontrol etmek için kullanılır.
Token tabanlı kimlik doğrulama sürecinde, token’ların belirli bir süre sonra geçersizleşmesi yaygın bir durumdur. Bu nedenle, token’ların yenilenmesi (refresh) işlemi önemlidir. Bu işlem, kullanıcının süresi dolmuş olan token’ını, geçerli bir refresh token kullanarak yeni bir access token ile değiştirir.
public class TokenService
{
public string GenerateRefreshToken()
{
var randomNumber = new byte[32];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(randomNumber);
return Convert.ToBase64String(randomNumber);
}
}
}
public class TokenService
{
public string GenerateAccessToken(string userId, string secretKey, string issuer, string audience, int expiryMinutes)
{
// Access token oluşturma işlemi...
}
public void RefreshToken(string refreshToken)
{
// Refresh token'ı kullanarak access token yenileme işlemi...
}
}
[HttpPost("refresh")]
public IActionResult RefreshToken([FromBody] RefreshTokenRequestModel model)
{
// Refresh token ile access token yenileme işlemi...
}
Token’ların yenilenmesi, uygulamanın güvenliğini ve kullanıcı deneyimini artıran önemli bir adımdır. Yukarıdaki adımları takip ederek, ASP.NET Core uygulamanızda süresi dolmuş token’ları yenileyebilirsiniz.
Veritabanını rollerle doldurmak, ASP.NET Core uygulamalarında rol tabanlı yetkilendirme (authorization) için önemli bir adımdır. Bu işlem, uygulama başlatıldığında belirli rollerin veritabanına eklenmesini ve kullanıcıların bu rollerle ilişkilendirilmesini sağlar.
public enum Roles
{
Admin,
User,
Manager
}
Rol Modeli Oluşturma: Rol bilgilerini temsil etmek için bir model oluşturmanız gerekebilir. Bu model, veritabanına rolleri eklemek için kullanılacaktır.
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
}
Veritabanına Rollerin Eklenmesi: Veritabanına rollerin eklenmesi işlemi, uygulamanın başlangıcında gerçekleştirilir. Bu işlem, veritabanına tanımlanan rollerin eklenmesini sağlar.
public static void SeedRoles(IServiceProvider serviceProvider)
{
using (var serviceScope = serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<YourDbContext>();
if (!context.Roles.Any())
{
var roles = Enum.GetNames(typeof(Roles)).ToList();
foreach (var roleName in roles)
{
context.Roles.Add(new Role { Name = roleName });
}
context.SaveChanges();
}
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Diğer middleware'lerin eklenmesi...
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
SeedRoles(serviceScope.ServiceProvider);
}
// Diğer middleware'lerin eklenmesi devam eder...
}
Bu adımları takip ederek, ASP.NET Core uygulamanızda rolleri veritabanına ekleyebilir ve rol tabanlı yetkilendirme sistemini kullanabilirsiniz. Bu sayede, kullanıcıların belirli rollerle ilişkilendirilmesi ve bu rollerin kullanıcıların erişim haklarını belirlemesi sağlanır.
Rol tabanlı doğrulama (role-based authentication) uygulamalarında, kullanıcının rolleri token içinde taşınarak yetkilendirme (authorization) sürecini kolaylaştırabilir. Bu rol bilgileri, token içinde rol id’leri veya rollerin adları şeklinde olabilir. Bu adımlarla rol bilgilerini token’lara eklemek mümkündür:
public string GenerateToken(string userId, IEnumerable<string> roles, string secretKey, string issuer, string audience, int expiryMinutes)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, userId)
};
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.UtcNow.AddMinutes(expiryMinutes),
signingCredentials: credentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
var roles = new List<string> { "Admin", "User" };
var token = GenerateToken(userId, roles, secretKey, issuer, audience, expiryMinutes);
[Authorize(Roles = "Admin")]
public IActionResult AdminAction()
{
// Sadece admin rolüne sahip kullanıcılar bu eylemi gerçekleştirebilir.
}
Bu adımları takip ederek, ASP.NET Core uygulamanızda rol bilgilerini token’lara ekleyebilir ve rol tabanlı yetkilendirme sistemini kullanabilirsiniz. Bu sayede, kullanıcıların rollerine göre erişim haklarını kontrol edebilir ve uygulamanızı güvenli hale getirebilirsiniz.
ASP.NET Core’da rol tabanlı yetkilendirme (role-based authentication) yapmak için, bir controller’a veya belirli bir işleve yalnızca belirli rollerdeki kullanıcıların erişimine izin vermek gerekebilir. Bu durumda, [Authorize] özniteliği rol tabanlı yetkilendirme için kullanılır.
[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
// Admin rolüne sahip kullanıcılar bu controller'a erişebilir.
}
[Authorize(Roles = "Admin,Manager")]
public class AdminController : Controller
{
// Admin veya Manager rolüne sahip kullanıcılar bu controller'a erişebilir.
}
Rolleri Kod İçinde Kontrol Etme: Bazı durumlarda, [Authorize] özniteliği kullanmadan rol bazlı doğrulamayı kod içinde kontrol etmek isteyebilirsiniz. Bu durumda, rolleri doğrudan kod içinde kontrol edebilirsiniz.
public IActionResult AdminAction()
{
if (User.IsInRole("Admin"))
{
// Admin rolüne sahip kullanıcılar bu eylemi gerçekleştirebilir.
}
else
{
return Forbid(); // Yetkisiz erişim durumunda 403 Forbidden döner.
}
}
Bu adımları izleyerek, ASP.NET Core uygulamanızda rol tabanlı yetkilendirme ekleyebilirsiniz. Bu sayede, belirli rollerdeki kullanıcıların belirli controller ve action’lara erişimini kontrol edebilirsiniz.
ASP.NET Core’da bir controller’a birden fazla rol eklemek, o controller’a erişim için birden fazla rolü gerektirebilir. Bu, belirli bir controller veya action’a erişmek için kullanıcının birden fazla role sahip olması gerektiği anlamına gelir.
[Authorize(Roles = "Admin,Manager")]
public class AdminController : Controller
{
// Admin veya Manager rolüne sahip kullanıcılar bu controller'a erişebilir.
}
public IActionResult AdminAction()
{
if (User.IsInRole("Admin") || User.IsInRole("Manager"))
{
// Admin veya Manager rollerinden birine sahip kullanıcılar bu eylemi gerçekleştirebilir.
}
else
{
return Forbid(); // Yetkisiz erişim durumunda 403 Forbidden döner.
}
}
Birden fazla rol eklemek, bir controller veya action’a erişim gereksinimlerini daha spesifik hale getirebilir ve uygulamanızın güvenliğini artırabilir. Bu yöntemle, farklı rollerdeki kullanıcıların belirli controller ve action’lara erişimini kontrol edebilirsiniz.
Bir sonraki yazıda görüşmek dileğiyle!”